Mivik

dream.cpp

Feb 2nd, 2022 (edited)
583
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.05 KB | None | 0 0
  1. #include <ametus.h>
  2.  
  3. MI cin;
  4.  
  5. typedef uint32_t ui;
  6. typedef uint64_t ul;
  7.  
  8. const int L = 4641589;
  9. const int $p = L;
  10. const ui mod = 998244353;
  11.  
  12. ui pr[$p + 1], phi[L + 1];
  13. bool co[L + 1];
  14. inline ui add(ui x, ui y) { return (x += y) >= mod? x - mod: x; }
  15. inline void Add(ui &x, ui y) { if ((x += y) >= mod) x -= mod; }
  16. inline ui sub(ui x, ui y) { return x - y + (x < y? mod: 0); }
  17. inline void Sub(ui &x, ui y) { if (x < y) x += mod; x -= y; }
  18. inline ui div2(ui x) { return ((x & 1)? x + mod: x) >> 1; }
  19. inline ul ksm(ul x, ul p = mod - 2) { ul r = 1; for (; p; p >>= 1, (x *= x) %= mod) if (p & 1) (r *= x) %= mod; return r; }
  20. inline ui s2(ul n) { return sub(ksm(2, n + 1), 2); }
  21. inline void sieve() {
  22.     phi[1] = 1;
  23.     E(i, 2, L) {
  24.         if (!co[i]) { pr[++pr[0]] = i; phi[i] = i - 1; }
  25.         E(j, pr[0]) {
  26.             let k = pr[j] * i; if (k > L) break;
  27.             co[k] = 1;
  28.             if (i % pr[j]) phi[k] = (ul)phi[i] * (pr[j] - 1) % mod;
  29.             else { phi[k] = (ul)phi[i] * pr[j] % mod; break; }
  30.         }
  31.         Add(phi[i], phi[i - 1]);
  32.     }
  33. }
  34. struct {
  35.     ul N; ui mem[2500];
  36.     static inline ul g_sum(ul n) { return n % mod; }
  37.     static inline ul fg_sum(ul n) { n %= mod; return n * (n + 1) / 2 % mod; }
  38.     inline void init(ul n) {
  39.         N = n;
  40.         memset(mem, -1, sizeof(mem));
  41.     }
  42.     inline ui operator()(ul n) {
  43.         if (n <= L) return phi[n];
  44.         ui &res = mem[N / n];
  45.         if (~res) return res;
  46.         ui sum = 0, lst = 1;
  47.         for (ul l = 2, r; l <= n; l = r + 1) {
  48.             let t = n / l; r = n / t; let cur = g_sum(r);
  49.             sum = (sum + (ul)sub(cur, lst) * operator()(t)) % mod;
  50.             lst = cur;
  51.         }
  52.         return res = sub(fg_sum(n), sum);
  53.     }
  54. } phi_sum;
  55. inline ui F(ul n) {
  56.     ui ans = phi_sum(n); ul s = 0;
  57.     while (n >>= 1) s += phi_sum(n);
  58.     return sub(ans, s % mod);
  59. }
  60. inline ui solve(ul n) {
  61.     if (!n) return 0;
  62.     phi_sum.init(n);
  63.     ui ans = s2(n), lst = 0;
  64.     for (ul l = 1, r; l <= n; l = r + 1) {
  65.         let d = n / l; let cur = s2(r = n / d);
  66.         ans = (ans + (ul)sub(cur, lst) * F(d)) % mod;
  67.         lst = cur;
  68.     }
  69.     return div2(ans);
  70. }
  71. int main() {
  72.     sieve(); ul l, r; cin > l > r;
  73.     cout < sub(solve(r), solve(l - 1)) < endl;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment