/** * date : 2023-04-06 22:55:51 */ #define NDEBUG #include #include using namespace std; #include #include using namespace std; namespace Base64 { using L = long long; char base[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; int ibase(char c) { return 'a' <= c ? 0x1A + c - 'a' : 'A' <= c ? 0x00 + c - 'A' : '0' <= c ? 0x34 + c - '0' : '+' == c ? 0x3E : 0x3F; } template string encode(vector &a) { T x = a[0], y = a[0]; for (auto &z : a) x = max(x, z), y = min(y, z); L N = a.size(), B = max(6, y < 0 ? sizeof(T) * 8 : 64 - __builtin_clzll(x)); string S((B * N + 11) / 6, 0); S[0] = B; for (int i = 0; i < N; i++) { for (int j = 0; j < B; j++) { if ((a[i] >> j) & 1) S[(i * B + j) / 6 + 1] |= 1 << ((i * B + j) % 6); } } for (auto &c : S) c = base[(int)c]; return S; } vector decode(string S) { for (auto &c : S) { c = ibase(c); } L B = S[0], M = S.size() - 1; vector a(6 * M / B, 0); for (int i = 0; i < M; i++) { for (int j = 0; j < 6; j++) { if ((S[i + 1] >> j) & 1) a[(i * 6 + j) / B] |= 1LL << ((i * 6 + j) % B); } } return a; } } // namespace Base64 string S = "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"; int main() { /* int M = 1002, Z = 1000000; vector v(M); v[0] = 1; for (long long i = 1, x = 1; i < M * Z; i++) { x = x * i % 1000000007; if (i % Z == 0) v[i / Z] = x; } cout << Base64::encode(v) << "\n"; */ auto a = Base64::decode(S); long long N, Z = 1000000; cin >> N; N = min(N, 1000000007LL); long long x = a[N / Z]; for (long long b = N / Z * Z + 1; b <= N; b++) { x = x * b % 1000000007; } cout << x << "\n"; }