2 1 3 1 5 1 1 11014 1 14409 9
Case 1: 9 Case 2: 736427HintFor the first sample input, all the 9 pairs of numbers are (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 5), (3, 4), (3, 5).
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <string> #include <algorithm> #include <queue> using namespace std; const int maxn = 10000+10; const int maxxn = 100000+10; typedef long long ll; int a,b,gcd; ll ans; bool isPrime[maxn]; ll minDiv[maxxn],phi[maxxn],sum[maxxn]; vector<int> prime,cnt[maxxn],digit[maxxn]; void getPrime(){ prime.clear(); memset(isPrime,1,sizeof isPrime); for(int i = 2;i < maxn; i++){ if(isPrime[i]){ prime.push_back(i); for(int j = i*i; j < maxn; j+=i){ isPrime[j] = 0; } } } } void getPhi(){ for(ll i = 1; i < maxxn; i++){ minDiv[i] = i; } for(ll i = 2; i*i < maxxn; i++){ if(minDiv[i]==i){ for(int j = i*i; j < maxxn; j += i){ minDiv[j] = i; } } } phi[1] = 1; sum[1] = 1; for(ll i = 2; i < maxxn; i++){ phi[i] = phi[i/minDiv[i]]; if((i/minDiv[i])%minDiv[i]==0){ phi[i] *= minDiv[i]; }else{ phi[i] *= minDiv[i]-1; } sum[i] = phi[i]+sum[i-1]; } } void getDigit(){ for(ll i = 1; i < maxxn; i++){ int x = i; for(int j = 0; j < prime.size()&&x >= prime[j]; j++){ if(x%prime[j]==0){ digit[i].push_back(prime[j]); int t = 0; while(x%prime[j]==0){ t++; x /= prime[j]; } cnt[i].push_back(t); } } if(x!=1){ digit[i].push_back(x); cnt[i].push_back(1); } } } int main(){ getPrime(); getPhi(); getDigit(); int ncase,T=1; cin >> ncase; while(ncase--){ int t1,t2; scanf("%d%d%d%d%d",&t1,&a,&t2,&b,&gcd); if(gcd==0){ printf("Case %d: 0\n",T++,ans); continue; }else{ if(a > b) swap(a,b); a /= gcd,b /= gcd; ans = sum[a]; for(ll i = a+1; i <= b; i++){ int d = digit[i].size(); int t = 0; vector<int> di; for(int k = 1; k < (1<<d); k++){ di.clear(); for(int f = 0; f < d; f++){ if(k&(1<<f)){ di.push_back(digit[i][f]); } } int ji = 1; for(int f = 0; f < di.size(); f++){ ji *= di[f]; } if(di.size()%2==0){ t -= a/ji; }else{ t += a/ji; } } ans += a-t; } printf("Case %d: ",T++); cout<<ans<<endl; } } return 0; }
HDU1695-GCD(数论-欧拉函数-容斥),布布扣,bubuko.com
原文:http://blog.csdn.net/mowayao/article/details/38321029