Dang_Quan_10_Tin

K ONLY

Oct 21st, 2022 (edited)
885
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.66 KB | None | 0 0
  1. #define task "KONLY"
  2.  
  3. #include <iostream>
  4. #include <cstdio>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. using ll = long long;
  10. using ld = long double;
  11.  
  12. constexpr int N = 1e5 + 5;
  13. constexpr int block = 320;
  14. constexpr ll mod = 220210212116;
  15.  
  16. int a, b, c, d, k;
  17. int in[N], beg[block], en[block];
  18. ll cnt[N][block];
  19. int var[N];
  20.  
  21. vector<int> factor[N];
  22.  
  23. #define bit(i, x) (((x) >> (i)) & 1)
  24.  
  25. ll Mul(ll a, ll b)
  26. {
  27.     ll q = (ld)a * b / mod;
  28.     ll r = a * b - q * mod;
  29.  
  30.     return (r % mod + mod) % mod;
  31. }
  32.  
  33. ll Sum(ll v)
  34. {
  35.     return v * (v + 1) / 2;
  36. }
  37. void Prepare()
  38. {
  39.     for (int i = 1; i < N; ++i)
  40.         factor[i].reserve(8);
  41.  
  42.     /// Sieve
  43.  
  44.     for (int i = 2; i < N; ++i)
  45.         if (factor[i].empty())
  46.             for (int j = i; j < N; j += i)
  47.                 factor[j].emplace_back(i);
  48.  
  49.     /// Prepare
  50.  
  51.     for (int i = 1; i < N; ++i)
  52.     {
  53.         in[i] = i / block + 1;
  54.         if (!beg[in[i]])
  55.             beg[in[i]] = i;
  56.         en[in[i]] = i;
  57.     }
  58.  
  59.     for (int i = 1; i <= 1e5; ++i)
  60.         for (int j = 1; j <= in[(int)1e5]; ++j)
  61.         {
  62.             cnt[i][j] = Sum(en[j]) % mod;
  63.             var[0] = 1;
  64.  
  65.             for (int h = 1; h < (1 << factor[i].size()); ++h)
  66.             {
  67.                 var[h] = var[h - (h & -h)] * factor[i][__lg(h & -h)];
  68.  
  69.                 (cnt[i][j] += (__builtin_popcount(h) & 1 ? -1 : 1) * Mul(var[h], Sum(en[j] / var[h]))) %= mod;
  70.             }
  71.  
  72.             cnt[i][j] = (cnt[i - 1][j] + cnt[i][j] * i) % mod;
  73.         }
  74. }
  75.  
  76. void Read()
  77. {
  78.     cin >> a >> b >> c >> d >> k;
  79.  
  80.     a = (a + k - 1) / k;
  81.     b /= k;
  82.     c = (c + k - 1) / k;
  83.     d /= k;
  84. }
  85.  
  86.  
  87. ll f(int u, int v)
  88. {
  89.     if (u == 0 || v == 0)
  90.         return 0;
  91.  
  92.     if (u > v)
  93.         swap(u, v);
  94.  
  95.     ll ans(cnt[v][in[u] - 1]);
  96.  
  97.     for (int i = beg[in[u]]; i <= u; ++i)
  98.     {
  99.         ll res = Sum(v) % mod;
  100.         var[0] = 1;
  101.  
  102.         for (int j = 1; j < (1 << factor[i].size()); ++j)
  103.         {
  104.  
  105.             var[j] = var[j - (j & -j)] * factor[i][__lg(j & -j)];
  106.  
  107.             (res += (__builtin_popcount(j) & 1 ? -1 : 1) * Mul(var[j], Sum(v / var[j])) ) %= mod;
  108.         }
  109.  
  110.         ans = (ans + res * i) % mod;
  111.     }
  112.  
  113.     return ans;
  114. }
  115.  
  116.  
  117. void Solve()
  118. {
  119.     cout << ((f(b, d) - f(a - 1, d) - f(b, c - 1) + f(a - 1, c - 1)) % mod * k % mod * k % mod + mod) % mod << "\n";
  120. }
  121.  
  122. int32_t main()
  123. {
  124.     ios::sync_with_stdio(0);
  125.     cin.tie(0);
  126.     cout.tie(0);
  127.     if (fopen(task ".INP", "r"))
  128.     {
  129.         freopen(task ".INP", "r", stdin);
  130.         freopen(task ".OUT", "w", stdout);
  131.     }
  132.  
  133.     Prepare();
  134.  
  135.     int t;
  136.     for (cin >> t; t--;)
  137.     {
  138.         Read();
  139.         Solve();
  140.     }
  141. }
  142.  
Advertisement
Add Comment
Please, Sign In to add comment