题意:http://acm.hdu.edu.cn/showproblem.php?pid=1695
直接上莫比乌斯模板。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const long long maxn=100005; 4 5 long long mu[maxn],pri[maxn],v[maxn],sum[maxn],cnt=0; 6 7 void init() 8 { 9 mu[1]=1; 10 for(long long i=2;i<maxn;i++) 11 { 12 if(!v[i]) 13 { 14 pri[++cnt]=i; 15 mu[i]=-1; 16 } 17 for(long long j=1;i*pri[j]<maxn;j++) 18 { 19 v[i*pri[j]]=1; 20 if(i%pri[j]==0) 21 { 22 mu[pri[j]*i]=0; 23 break; 24 } 25 mu[i*pri[j]]=-mu[i]; 26 } 27 } 28 sum[0]=0; 29 for(long long i=1;i<maxn;i++) 30 sum[i]=sum[i-1]+mu[i]; 31 } 32 int main() 33 { 34 init(); 35 long long a,b,c,d,k; 36 long long t; 37 scanf("%lld",&t); 38 for(long long ca=1;ca<=t;ca++) 39 { 40 scanf("%lld%lld%lld%lld%lld",&a,&b,&c,&d,&k); 41 if(k==0) 42 { 43 printf("Case %lld: %lld ",ca,0); 44 continue; 45 } 46 b/=k,d/=k; 47 if(b>d) 48 swap(b,d); 49 long long ans1=0,ans2=0; 50 for(long long i=1,r;i<=b;i=r+1) 51 { 52 r=min(b/(b/i),d/(d/i)); 53 ans1+=(sum[r]-sum[i-1])*(b/i)*(d/i); 54 ans2+=(sum[r]-sum[i-1])*(b/i)*(b/i); 55 } 56 printf("Case %lld: %lld ",ca,ans1-ans2/2); 57 } 58 return 0; 59 }