简单的容斥原理!!!
代码如下:
1 #include<iostream> 2 #include<stdio.h> 3 #include<cstring> 4 #include<algorithm> 5 #define I(x) scanf("%d",&x) 6 #define ll __int64 7 #define MAX 500000 8 using namespace std; 9 int prime[MAX],cnt,e[MAX],num; 10 ll a,b,res1,res2; 11 bool f[MAX]; 12 void init() 13 { 14 cnt=0; 15 memset(f,0,sizeof(f)); 16 for(int i=2;i<MAX;i++){ 17 if(!f[i]) prime[cnt++]=i; 18 for(int j=0;j<cnt&&i*prime[j]<MAX;j++){ 19 f[i*prime[j]]=1; 20 if(i%prime[j]==0) break; 21 } 22 } 23 } 24 void fac(ll n) 25 { 26 num=0; 27 for(int i=0;i<cnt&&prime[i]*prime[i]<=n;i++){ 28 if(n%prime[i]==0){ 29 e[num++]=prime[i]; 30 n/=prime[i]; 31 while(n%prime[i]==0) n/=prime[i]; 32 } 33 } 34 if(n>1) e[num++]=n; 35 } 36 void dfs(ll sum,int d,int c,ll &ans,ll n) 37 { 38 if(sum>n) return; 39 ans-=(ll)(n/sum*c); 40 for(int i=d+1;i<num;i++) 41 dfs((ll)sum*e[i],i,-c,ans,n); 42 } 43 int main(){ 44 int t,ca=0; 45 ll n; 46 init(); 47 I(t); 48 while(t--){ 49 scanf("%I64d%I64d%I64d",&a,&b,&n); 50 fac(n); 51 res1=a-1; 52 res2=b; 53 for(int i=0;i<num;i++){ 54 dfs(e[i],i,1,res1,a-1); 55 dfs(e[i],i,1,res2,b); 56 } 57 printf("Case #%d: %I64d ",++ca,res2-res1); 58 } 59 return 0; 60 }