题目连接:HDU - 4135
开始学容斥原理。
1 #include<cstdio> 2 #include<cstring> 3 #define LL long long 4 const int maxn=100; 5 6 LL prime[maxn]; 7 LL a,b,n; 8 LL func(LL up,int m) 9 { 10 LL ans=0,temp=1; 11 int flag; 12 for(LL i=1;i<(1ll<<m);i++) 13 { 14 temp=1,flag=0; 15 for(int j=0;j<m;j++) if(i&(1ll<<j)) 16 ++flag,temp*=prime[j]; 17 if(flag&1) //容斥原理,奇加偶减 18 ans+=up/temp; 19 else ans-=up/temp; 20 } 21 return ans; 22 } 23 24 int factor(LL n) //对n进行素数分解 25 { 26 int num=0; 27 for(LL i=2;i*i<=n;i++) if(n&&n%i==0) 28 { 29 prime[num++]=i; 30 while(n&&n%i==0) n/=i; 31 } 32 if(n>1) 33 prime[num++]=n; 34 return num; 35 } 36 int main() 37 { 38 int t; 39 scanf("%d",&t); 40 for(int i=1;i<=t;i++) 41 { 42 int num=0; 43 scanf("%lld%lld%lld",&a,&b,&n); 44 num=factor(n); 45 LL ans=(b-func(b,num))-(a-1-func(a-1,num)); 46 printf("Case #%d: %lld ",i,ans); 47 } 48 }