#include #define ll long long #define INF 1000000005 #define MOD 1000000007 #define EPS 1e-10 #define rep(i,n) for(int i=0;i<(int)(n);++i) #define rrep(i,n) for(int i=(int)(n)-1;i>=0;--i) #define srep(i,s,t) for(int i=(int)(s);i<(int)(t);++i) #define each(a,b) for(auto& (a): (b)) #define all(v) (v).begin(),(v).end() #define len(v) (int)(v).size() #define zip(v) sort(all(v)),v.erase(unique(all(v)),v.end()) #define cmx(x,y) x=max(x,y) #define cmn(x,y) x=min(x,y) #define fi first #define se second #define pb push_back #define show(x) cout<<#x<<" = "<<(x)< P; typedef pair pll; typedef vector vi; typedef vector vvi; typedef vector vl; typedef vector vvl; typedef vector vd; typedef vector

vp; typedef vector vs; const int MAX_N = 100005; inline int add(int x,int y) { return (x + y)%MOD; } inline int sub(int x,int y) { return (x+MOD-y)%MOD; } inline int mul(int x,int y) { return (ll)x*y%MOD; } template void rec(const vector& c, vector& res, const long long n, const int k) { if(n < k){ res[k-1-n] = 1; return; } rec(c, res, n/2, k); vector num(k+1, 0), sm(k+1, 0); vector tmp = res; int flag = n % 2; if(!flag) for(int i = 0; i <= k; i++) sm[i] = mul(res[i], tmp[k-1]); for(int i = 0; i < k - !flag; i++){ for(int j = 0; j <= k-1; j++){ num[j] = add(mul(res[0], c[j]), res[j+1]); } num[k-1] = mul(res[0], c[k-1]), num[k] = add(mul(res[0], c[k]), res[k]); for(int j = 0; j <= k; j++){ sm[j] = add(sm[j], mul(num[j], tmp[k-2-i+flag])), res[j] = num[j]; } } sm[k] = add(sm[k], tmp[k]); res = sm; } template T solve(vector& c, vector& x, const long long n) { int k = (int)x.size(); vector res(k+1, 0); rec(c, res, n, k); T ans = 0; for(int i = 0; i < k; i++) ans = add(ans, mul(res[i], x[k-1-i])); return add(ans, res[k]); } int main() { cin.tie(0); ios::sync_with_stdio(false); ll b,c,d; cin >> b >> c >> d; b %= MOD, c %= MOD; vi a = {(int)c,(int)(b*c%MOD)}, x = {0}; cout << solve(a,x,d) << "\n"; return 0; }