1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 int t,cnt,prime[15];LL a,b,n; 5 LL solve(LL x){//求與n不互質的總個數 6 int num;LL ans=0,tp; 7 for(int i=1;i<(1<<cnt);++i){//用二進制來表示每一個質因子是否被使用,即有2^cnt-1種可能,此時cnt較小,題目中1e9最多也就8個素因子,二進制優化 8 tp=1,num=0; 9 for(int j=0;j<cnt;++j) 10 if(i&(1<<j))num++,tp*=prime[j];//表示選擇哪幾個素因子 11 if(num&1)ans+=x/tp;//奇加 12 else ans-=x/tp;//偶減 13 } 14 return x-ans; 15 } 16 int main(){ 17 while(~scanf("%d",&t)){ 18 for(int i=1;i<=t;++i){ 19 scanf("%lld%lld%lld",&a,&b,&n);cnt=0; 20 for(LL j=2;j*j<=n;++j){//求出n內的全部質因子 21 if(n%j==0){ 22 prime[cnt++]=j; 23 while(n%j==0)n/=j; 24 } 25 } 26 if(n>1)prime[cnt++]=n; 27 printf("Case #%d: %lld\n",i,solve(b)-solve(a-1));//區間差 28 } 29 } 30 return 0; 31 }