bingxuan9112

# {gcd(i,j) == g} for 1<= i <= n, 1 <= j <= m

Feb 27th, 2020
300
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.93 KB | None | 0 0
  1. #include <cstdio>
  2. #include <vector>
  3.  
  4.  
  5. const int N = 50025;
  6. bool sv[N];
  7. int mu[N], smu[N];
  8. std::vector<int> prs;
  9. inline int min(int a, int b) {return a<b?a:b;}
  10. signed main() {
  11.     mu[1] = 1;
  12.     for(int i = 2; i < N; i++) {
  13.         if(!sv[i]) prs.emplace_back(i), mu[i] = -1;
  14.         for(int p: prs) {
  15.             if(i*p >= N) break;
  16.             sv[i*p] = true;
  17.             if(i%p) {
  18.                 mu[i*p] = -mu[i];
  19.             }else {
  20.                 mu[i*p] = 0;
  21.                 break;
  22.             }
  23.         }
  24.     }
  25.     for(int i = 1; i < N; i++) smu[i] = smu[i-1]+mu[i];
  26.     int n, m, g;
  27.     while(scanf("%d%d%d", &n, &m, &g), n || m || g) {
  28.         n /= g, m /= g;
  29.         long long ans = 0;
  30.         for(int i = 1, j; i <= n && i <= m; i = j) { // [i, j)
  31.             j = min(n/(n/i), m/(m/i))+1;
  32.             ans += 1LL * (smu[j-1] - smu[i-1]) * (n/i) * (m/i);
  33.         }
  34.         printf("%lld\n", ans);
  35.     }
  36. }
Advertisement
Add Comment
Please, Sign In to add comment