#include using namespace std; #define rep(i,n) for(ll i=0;i=0;i--) #define perl(i,r,l) for(ll i=r-1;i>=l;i--) #define fi first #define se second #define pb push_back #define ins insert #define pqueue(x) priority_queue,greater> #define all(x) (x).begin(),(x).end() #define CST(x) cout<; using vvl=vector>; using pl=pair; using vpl=vector; using vvpl=vector; ll MOD=1000000007; ll MOD9=998244353; int inf=1e9+10; ll INF=1e18; ll dy[8]={1,0,-1,0,1,1,-1,-1}; ll dx[8]={0,1,0,-1,1,-1,1,-1}; template inline bool chmax(T &a, T b) { return ((a < b) ? (a = b, true) : (false)); } template inline bool chmin(T &a, T b) { return ((a > b) ? (a = b, true) : (false)); } ll mod=1000000007;//一次元ベクトルの高速化dp vl matmul(vl &dp, vvl &mt){ ll m=dp.size(); vl ret(m,0); rep(i,m)rep(j,m){ ret[i]+=mt[i][j]*dp[j]; ret[i]%=mod; } return ret; } vvl update(vvl &mt){ ll m=mt.size(); vvl ret(m,vl(m,0)); rep(i,m)rep(j,m)rep(k,m){ ret[i][j]+=mt[i][k]*mt[k][j]; ret[i][j]%=mod; } return ret; } void matpow(vl &dp, vvl &mt, ll k){ ll m=dp.size(); while(k){ if(k&1)dp=matmul(dp,mt); mt=update(mt); k/=2; } } vl calc(ll p,vl v){ ll dp[p+1][100][6];memset(dp,0,sizeof(dp));dp[0][0][0]=1; rep(i,p){ rep(j,80){ rep(k,6){ for(int l=k;l<6;l++){ dp[i+1][j+v[l]][l]+=dp[i][j][k]; } } } } vl ans(100); rep(i,100)rep(j,6)ans[i]+=dp[p][i][j]; return ans; } int main(){ ll n,p,c;cin>>n >> p >> c; vl v1={2,3,5,7,11,13},v2={4,6,8,9,10,12}; vl x=calc(p,v1),y=calc(c,v2); vl to(140); rep(i,70){ rep(j,70){ if(i+j-1>=0)to[i+j-1]+=x[i]*y[j]; } } //rep(i,15)cout << to[i] <<" ";cout << endl; vvl mat(140,vl(140)); vl dp(140);dp[0]=1; rep(i,139)mat[i+1][i]=1; mat[0]=to; matpow(dp,mat,n); ll ans=0; //rep(i,10)cout << dp[i] <<" ";cout << endl; repl(i,1,140){ ll now=n-i; repl(j,1,140){ if(now+j>=n){ ans+=dp[i]*to[j-1]; ans%=MOD; } } } cout << ans <