HDU4135:容斥原理之補集轉化spa
求(a,b)區間於n互質的數的個數code
那麼咱們只要找到區間內與n不互質的數的個數就行了blog
首先咱們將n分解質因數io
那麼就變成了class
是一個質因數的倍數的數的個數 - 是兩個質因數的倍數的數的個數 + 是三個質因數的倍數的數的個數......原理
直接容斥原理就行了im
1 #include<cstdio> 2 int n,pn; 3 long long a,b; 4 int prime[35]; 5 long long calc(long long n) 6 { 7 long long res=0; 8 for(int i=1;i<(1<<pn);i++) 9 { 10 int tmp=1,cnt=0; 11 for(int j=0;j<pn;j++) 12 { 13 if(((i>>j)&1)==0) continue; 14 ++cnt; 15 tmp*=prime[j]; 16 } 17 if(cnt&1) res+=n/tmp; 18 else res-=n/tmp; 19 } 20 return n-res; 21 } 22 int main() 23 { 24 int T; 25 scanf("%d",&T); 26 for(int cas=1;cas<=T;cas++) 27 { 28 scanf("%lld%lld%d",&a,&b,&n); 29 //篩素數 30 pn=0; 31 for(int i=2;i*i<=n;i++) 32 { 33 if(n%i) continue; 34 while(n%i==0) n/=i; 35 prime[pn++]=i; 36 } 37 if(n!=1) prime[pn++]=n; 38 printf("Case #%d: %lld\n",cas,calc(b)-calc(a-1)); 39 } 40 return 0; 41 }
固然咱們求的是補集,要記得用總數減一下di