結果
問題 | No.2705 L to R Graph (Another ver.) |
ユーザー | zlxFTH |
提出日時 | 2024-05-25 12:44:29 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 4,735 bytes |
コンパイル時間 | 2,330 ms |
コンパイル使用メモリ | 207,568 KB |
実行使用メモリ | 27,048 KB |
最終ジャッジ日時 | 2024-05-25 12:44:37 |
合計ジャッジ時間 | 7,791 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 53 ms
27,048 KB |
testcase_01 | AC | 52 ms
19,656 KB |
testcase_02 | AC | 55 ms
20,140 KB |
testcase_03 | AC | 50 ms
20,580 KB |
testcase_04 | AC | 54 ms
19,796 KB |
testcase_05 | AC | 52 ms
19,684 KB |
testcase_06 | AC | 59 ms
20,320 KB |
testcase_07 | AC | 52 ms
19,588 KB |
testcase_08 | TLE | - |
testcase_09 | -- | - |
testcase_10 | -- | - |
testcase_11 | -- | - |
testcase_12 | -- | - |
testcase_13 | -- | - |
testcase_14 | -- | - |
testcase_15 | -- | - |
testcase_16 | -- | - |
testcase_17 | -- | - |
testcase_18 | -- | - |
testcase_19 | -- | - |
testcase_20 | -- | - |
testcase_21 | -- | - |
testcase_22 | -- | - |
testcase_23 | -- | - |
testcase_24 | -- | - |
testcase_25 | -- | - |
testcase_26 | -- | - |
testcase_27 | -- | - |
testcase_28 | -- | - |
testcase_29 | -- | - |
testcase_30 | -- | - |
testcase_31 | -- | - |
testcase_32 | -- | - |
testcase_33 | -- | - |
testcase_34 | -- | - |
testcase_35 | -- | - |
testcase_36 | -- | - |
testcase_37 | -- | - |
testcase_38 | -- | - |
testcase_39 | -- | - |
testcase_40 | -- | - |
testcase_41 | -- | - |
testcase_42 | -- | - |
testcase_43 | -- | - |
testcase_44 | -- | - |
testcase_45 | -- | - |
testcase_46 | -- | - |
testcase_47 | -- | - |
testcase_48 | -- | - |
testcase_49 | -- | - |
testcase_50 | -- | - |
testcase_51 | -- | - |
testcase_52 | -- | - |
ソースコード
#include <bits/stdc++.h> using namespace std; #define debug(...) fprintf(stderr, __VA_ARGS__) using LL = long long; const int N = 1e5 + 5; struct Mod { LL m, p; void init(LL pp) { p = pp; m = (__int128(1) << 64) / p; } LL operator()(LL x) { return x - (__int128(x) * m >> 64) * p; } } mod; int P; inline LL qp(LL a, LL b = P - 2) { LL c = 1; while (b) { if (b & 1) c = mod(c * a); a = mod(a * a); b /= 2; } return c; } LL fac[N], ifac[N], pn[N]; void initC(int n) { fac[0] = 1; for (int i = 1; i <= n; ++i) fac[i] = mod(fac[i - 1] * i); ifac[n] = qp(fac[n]); for (int i = n; i > 0; --i) ifac[i - 1] = mod(ifac[i] * i); } inline LL binom(int n, int m) { if (n < m || m < 0) return 0; return mod(mod(fac[n] * ifac[m]) * ifac[n - m]); } LL mu[N]; void initP(int n) { int m = 0; static LL v[N], p[N]; mu[1] = 1; for (int i = 2; i <= n; ++i) { if (!v[i]) v[i] = i, p[++m] = i, mu[i] = -1; for (int j = 1; j <= m && p[j] * i <= n; ++j) { v[p[j] * i] = p[j]; if (i % p[j] == 0) { mu[p[j] * i] = 0; } else { mu[p[j] * i] = -mu[i]; } } } } int n; LL f[N], g[N]; vector<int> d[N]; void initD(int n) { for (int i = 1; i <= n; ++i) { for (int j = i; j <= n; j += i) { d[j].push_back(i); } } } void calcF() { static LL s[N]; for (int l = 1; l <= n; ++l) { auto calc = [&](int L, int R, int v) { for (int i = L; i <= R; ++i) { int x = (i + v - 1) / v; int j = min(R, x * v); if (x == l) ++x; if (x <= n && l < x) { s[i] = mod(s[i] + n - x + 1); s[j + 1] = mod(s[j + 1] + P - (n - x + 1)); } i = j; } }; for (int i = 1; i <= (n - 1) / l; ++i) { int L = i * l, R = (i + 1) * l - 1; L = max(L, 1); R = min(R, n - 1); if (L <= R) calc(L, R, i); } } for (int i = 1; i <= n; ++i) { s[i] = mod(s[i] + s[i - 1]); } for (int i = 1; i <= n; ++i) { s[i] = mod(s[i] + s[i - 1]); } for (int i = 0; i <= n; ++i) { if (!i) { f[i] = P - mod(LL(n) * (n - 1) / 2); } else { // for (int j = 1; j < i; ++j) { // for (int l = 1; l <= n; ++l) { // int x = j / l; // if (!x) continue; // int r = (j + x - 1) / x; // if (r == l) ++r; // if (r <= n && l < r) { // f[i] = mod(f[i] + n - r + 1); // } // } // } for (int r = n; r >= 1; --r) { int x = (i + r - 1) / r; int l = (i + x - 1) / x; f[i] = mod(f[i] + LL(r - l + 1) * x); r = l; } // for (int j = 1; j <= n; ++j) { // f[i] = mod(f[i] + (i + j - 1) / j); // } } } for (int i = 1; i <= n; ++i) { f[i] = mod(f[i] + s[i - 1]); } } void calcG() { vector<int> vis(n + 1); for (int c = 1; c <= n; ++c) { g[c] = mod(mod(LL(n) * (n - 1) / 2) * c); // BF1 // for (int j = 1; j <= n; ++j) { // if (j % c == 0) continue; // int x = j % c; // g[c] = mod(g[c] + c / __gcd(x, c) - 1); // } // BF2 // vector<int> d1, d2; // for (int i = 1; i * i <= c; ++i) { // if (c % i) continue; // d1.push_back(i); // if (c / i != i) d2.push_back(c / i); // } // reverse(d1.begin(), d1.end()); // for (auto v : d2) { // for (int i = v; i < c; i += v) if (vis[i] != c) { // vis[i] = c; // g[c] = mod(g[c] + LL(c / v - 1) * ((n - i) / c + 1)); // } // } // for (auto v : d1) { // for (int i = v; i < c; i += v) if (vis[i] != c) { // vis[i] = c; // g[c] = mod(g[c] + LL(c / v - 1) * ((n - i) / c + 1)); // } // } auto calcg = [&](int v) { LL res = 0; for (auto i : d[c / v]) { if (!mu[i]) continue; LL var = n / v / i; if (mu[i] == -1) var = P - var; res = mod(res + var); } g[c] = mod(g[c] + (c / v - 1) * res); }; for (auto i : d[c]) calcg(i); } } int main() { cin.tie(0)->sync_with_stdio(0); cin >> n >> P; mod.init(P); initC(N - 5); initP(N - 5); initD(N - 5); pn[0] = 1; for (int i = 1; i <= n; ++i) pn[i] = mod(pn[i - 1] * n); calcF(); calcG(); // calc ans for (int i = 1; i <= n; ++i) f[i] = mod(f[i] + f[i - 1]); for (int i = 1; i <= n; ++i) g[i] = mod(g[i] + g[i - 1]); LL ans = 0; for (int j = 0; j <= n; ++j) { LL res = mod(binom(n, j) * pn[n - j]); res = mod(res * fac[j]); // for (int i = 0; i < j; ++i) { // ans = mod(ans + (f[i] + g[j - i]) * res); // } res = mod(res * ((j == 0 ? 0 : f[j - 1]) + g[j])); ans = mod(ans + res); } cout << ans % P << "\n"; return 0; }