Dang_Quan_10_Tin

K ONLY

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