#pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include #include using namespace std; typedef long long ll; const int INF = 1<<30; const ll INFLL = 1LL<<60; const ll MOD = 998244353; const double INFD = 1.0E10; const int dx[4] = {1, 0, -1, 0}; const int dy[4] = {0, -1, 0, 1}; map dm = {{0, 'D'}, {1, 'L'}, {2, 'U'}, {3, 'R'}}; // const int dx[8] = {1, 1, 0, -1, -1, -1, 0, 1}; // const int dy[8] = {0, 1, 1, 1, 0, -1, -1, -1}; using Pair = pair; // using mint = atcoder::modint998244353; using mint = atcoder::modint1000000007; vector convolution_naive(const vector& a, const vector& b) { vector c(a.size() + b.size() - 1); for (int i = 0; i < (int)a.size(); i++) { for (int j = 0; j < (int)b.size(); j++) { c[i + j] += a[i] * b[j]; } } return c; } mint bostan_mori(vector P, vector Q, long long n){ while (n > 0){ vector Q_neg(Q.size()); for (int i = 0; i < (int)Q.size(); i++) Q_neg[i] = (i % 2) ? -Q[i] : Q[i]; // vector U = atcoder::convolution(P, Q_neg); // vector V = atcoder::convolution(Q, Q_neg); vector U = convolution_naive(P, Q_neg); vector V = convolution_naive(Q, Q_neg); P.clear(); Q.clear(); for (int i = n & 1; i < (int)U.size(); i += 2) P.push_back(U[i]); for (int i = 0; i < (int)V.size(); i += 2) Q.push_back(V[i]); n >>= 1; } return P[0] / Q[0]; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout << fixed << setprecision(15); ll a, b, n; cin >> a >> b >> n; vector p = {0, 1}; vector q = {1, -a, -b}; mint ans = bostan_mori(p, q, n); cout << ans.val() << endl; return 0; }