#include #include #include #include #include #include #include #include #include #include using namespace std; #define MOD 1000000007 int a[] = {2,3,5,7,11,13}; int b[] = {4,6,8,9,10,12}; template class kitamasa{ public: int max_n; vector A; vector X; kitamasa(vector& a, vector& x){ for(int i=0; i Σ Ri Xi ( i = 0...d ) vector func(const vector& P, const vector& Q){ int d = A.size(); vector tmp(2*d-1, 0); for(int i=0; i= MOD) tmp[i+j] %= MOD; } } for(int i=2*d-2; i>=d; --i){ for(int j=0; j= MOD) tmp[i - d + j] %= MOD; } } tmp.resize(d); return tmp; } T calc(T k){ int d = A.size(); int lg = 0; while((1LL<> B(lg, vector(d, 0)); B[0][1] = 1; for(int i=0; i+1 res = B[0]; int r = 0; while(k){ if(k & 1){ res = func(res, B[r]); } k>>=1; r++; } T ret = 0; for(int i=0; i> n >> p >> c; int sz = 13*p + 12*c + 1; vector> dp(p+c+1, vector(sz, 0)); dp[0][0] = 1; for(int i=0; i<6; i++){ for(int j=0; j= sz) continue; dp[j+1][k+a[i]] += dp[j][k]; if(dp[j+1][k+a[i]] >= MOD) dp[j+1][k+a[i]] %= MOD; } } } for(int i=0; i<6; i++){ for(int j=p; j= sz) continue; dp[j+1][k+b[i]] += dp[j][k]; if(dp[j+1][k+b[i]] >= MOD) dp[j+1][k+b[i]] %= MOD; } } } vector A(sz, 0); for(int i=1; i X(sz, 1); kitamasa ktms(A,X); long long ans = ktms.calc(n+sz-2); cout << ans << endl; return 0; }