#include #include #include using namespace atcoder; using mint = modint1000000007; using namespace std; #define rep(i,n) for (int i = 0; i < (n); ++i) #define Inf 1000000000000000 vector get(int n,vector x){ vector dp(n+1,vector(140,0)); dp[0][0] = 1; rep(i,6){ vector ndp(n+1,vector(140,0)); rep(j,n+1){ rep(k,140){ rep(l,n+1){ if(j+l>n)break; int nj = j+l; int nk = k + x[i] * l; if(nk>140)break; ndp[nj][nk] += dp[j][k]; } } } swap(dp,ndp); } return dp.back(); } vector mul(vector a,vector b){ vector c(a.size()+b.size()-1,0); rep(i,a.size()){ rep(j,b.size()){ c[i+j] += a[i]*b[j]; } } return c; //return convolution(a,b); } //suppose m = a.size() //for i, //x[i] = a[i](i a,vector c,long long n){ int d = c.size(); rep(i,c.size()){ c[i] *= -1; } c.insert(c.begin(),1); a.insert(a.begin(),0); a = mul(a,c); while(a.size()>1+d)a.pop_back(); while(n!=0){ auto cinv = c; for(int i=1;i na; for(int i=(n&1LL);i nc; for(int i=0;i>=1; } return a[0] / c[0]; } int main(){ vector p = {2,3,5,7,11,13}; vector c = {4,6,8,9,10,12}; long long N,P,C; cin>>N>>P>>C; auto x = get(P,p); auto y = get(C,c); vector z(140,0); rep(i,140){ rep(j,140){ if(i+j<140){ z[i+j] += x[i]*y[j]; } } } //cout< aa(139,0); aa.back() = 1; for(int i=1;i<140;i++){ long long n = N-i; if(n<0)break; mint temp; if(n>=0)temp = Bostan_Mori(aa,z,n+138+1); else temp = 1; mint sum = 0; for(int j=i;j<140;j++)sum += z[j-1]; ans += sum * temp; } cout<