#include #include #define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i)) using namespace std; typedef long long ll; typedef vector Poly; const int Mod = 1000000007; inline void add(int &x, int y) { if((x += y) >= Mod) x -= Mod; } Poly doDP(const int a[6], int n) { vector dp(n+1, Poly(a[5] * n + 1)); dp[0][0] = 1; int z = a[0]; rep(k, 6) { int d = a[k]; for(int t = 0; t < n; ++ t) for(int i = t * z; i <= t * d; ++ i) add(dp[t + 1][i + d], dp[t][i]); } return dp[n]; } Poly mul(const Poly &p, const Poly &q) { int pn = p.size(), qn = q.size(); if(pn == 0 || qn == 0) return Poly(); Poly r(pn + qn - 1); rep(i, pn) rep(j, qn) add(r[i + j], (ll)p[i] * q[j] % Mod); return r; } Poly rem(const Poly &p, const Poly &q) { int pd = p.size() - 1, qd = q.size() - 1; if(pd < qd) return p; Poly r = p; for(int i = pd; i >= qd; -- i) { int t = Mod - r[i]; rep(j, qd) add(r[i - qd + j], (ll)t * q[j] % Mod); } r.resize(qd); return r; } Poly powmod(const Poly &t, ll K, const Poly &q) { Poly p = rem(t, q); int l = 0; while((K >> l) > 1) ++ l; Poly res = p; for(-- l; l >= 0; -- l) { res = rem(mul(res, res), q); if(K >> l & 1) res = rem(mul(res, p), q); } return res; } int main() { long long N; int P, C; cin >> N >> P >> C; const int ps[6] = { 2, 3, 5, 7, 11, 13 }; const int cs[6] = { 4, 6, 8, 9, 10, 12 }; vector cntP, cntC; cntP = doDP(ps, P); cntC = doDP(cs, C); int X = P * ps[5] + C * cs[5]; Poly pc = mul(cntP, cntC); pc.resize(X + 1); Poly mod(X + 1); rep(i, X) mod[i] = Mod - pc[X - i]; mod[X] = 1; Poly v = powmod(Poly{{0, 1}}, X + (N - 1), mod); ll ans = 0; rep(i, v.size()) ans += v[i]; printf("%d\n", ans % Mod); return 0; }