| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 
 | #include<bits/stdc++.h>#pragma warning(disable:4996)
 using namespace std;
 #define rep(i,a,n) for (int i=a;i<n;i++)
 #define per(i,a,n) for (int i=n-1;i>=a;i--)
 #define pb push_back
 #define mp make_pair
 #define all(x) (x).begin(),(x).end()
 #define fi first
 #define se second
 #define SZ(x) ((int)(x).size())
 typedef vector<int> VI;
 typedef long long ll;
 typedef pair<int, int> PII;
 const ll mod = 1000000007;
 ll powmod(ll a, ll b) { ll res = 1; a %= mod; assert(b >= 0); for (; b; b >>= 1) { if (b & 1)res = res * a % mod; a = a * a % mod; }return res; }
 ll n;
 namespace linear_seq {
 const int N = 10010;
 ll res[N], base[N], _c[N], _md[N];
 
 vector<int> Md;
 void mul(ll* a, ll* b, int k) {
 rep(i, 0, k + k) _c[i] = 0;
 rep(i, 0, k) if (a[i]) rep(j, 0, k) _c[i + j] = (_c[i + j] + a[i] * b[j]) % mod;
 for (int i = k + k - 1; i >= k; i--) if (_c[i])
 rep(j, 0, SZ(Md)) _c[i - k + Md[j]] = (_c[i - k + Md[j]] - _c[i] * _md[Md[j]]) % mod;
 rep(i, 0, k) a[i] = _c[i];
 }
 int solve(ll n, VI a, VI b) {
 ll ans = 0, pnt = 0;
 int k = SZ(a);
 assert(SZ(a) == SZ(b));
 rep(i, 0, k) _md[k - 1 - i] = -a[i]; _md[k] = 1;
 Md.clear();
 rep(i, 0, k) if (_md[i] != 0) Md.push_back(i);
 rep(i, 0, k) res[i] = base[i] = 0;
 res[0] = 1;
 while ((1ll << pnt) <= n) pnt++;
 for (int p = pnt; p >= 0; p--) {
 mul(res, res, k);
 if ((n >> p) & 1) {
 for (int i = k - 1; i >= 0; i--) res[i + 1] = res[i]; res[0] = 0;
 rep(j, 0, SZ(Md)) res[Md[j]] = (res[Md[j]] - res[k] * _md[Md[j]]) % mod;
 }
 }
 rep(i, 0, k) ans = (ans + res[i] * b[i]) % mod;
 if (ans < 0) ans += mod;
 return ans;
 }
 VI BM(VI s) {
 VI C(1, 1), B(1, 1);
 int L = 0, m = 1, b = 1;
 rep(n, 0, SZ(s)) {
 ll d = 0;
 rep(i, 0, L + 1) d = (d + (ll)C[i] * s[n - i]) % mod;
 if (d == 0) ++m;
 else if (2 * L <= n) {
 VI T = C;
 ll c = mod - d * powmod(b, mod - 2) % mod;
 while (SZ(C) < SZ(B) + m) C.pb(0);
 rep(i, 0, SZ(B)) C[i + m] = (C[i + m] + c * B[i]) % mod;
 L = n + 1 - L; B = T; b = d; m = 1;
 }
 else {
 ll c = mod - d * powmod(b, mod - 2) % mod;
 while (SZ(C) < SZ(B) + m) C.pb(0);
 rep(i, 0, SZ(B)) C[i + m] = (C[i + m] + c * B[i]) % mod;
 ++m;
 }
 }
 return C;
 }
 int gao(VI a, ll n) {
 VI c = BM(a);
 c.erase(c.begin());
 rep(i, 0, SZ(c)) c[i] = (mod - c[i]) % mod;
 return solve(n, c, VI(a.begin(), a.begin() + SZ(c)));
 }
 };
 int a[1000] = { 1,20,216,1840,13775,95040,619801,3878720,23520456,139127500,806585879,599175652,861664394,707058859,417979870,901047604,478633297,859865743,368755586,930893321,243990638,416220770,156922876,768961406,372030171,188255286,753829864,246844887,442658427,357182332,744405222,783203806,469197530,863684841,605924134,166060944,506226150,446220745,171110722,498919220,700717610,739340306,607058637,253306001,703467596,231535400,903802311,143421365,864786702,113238066,748503739,575557576,596128329,62322981,98752077,240806338,956345596,374036254,976624372,344168146,879827644,658625868,76392155,576562868,336205776,392396240,70109394,71982377,780620194,821250696,668859101,16081127,485315931,278337560,180126339,172842175,402815218,33449281,512582468,457919375,64916357,966658493,531395887,571188277,243742869,586283678,302575818,40249574,901283990,633872644,396221397,13159314,543397157,575791218,993120783,494677489,620570286,883513941,153287837,309800837 };
 int main() {
 vector<int>v;
 for (int i = 0; i < 50; i++) {
 v.push_back(a[i]);
 }
 scanf("%lld", &n);
 printf("%lld\n", 1LL * linear_seq::gao(v, n - 1) % mod);
 }
 
 |