1. 程式人生 > >Co-prime HDU - 4135(題解)

Co-prime HDU - 4135(題解)

queue soft 記得 相對 ostream hdu 數字 co-prime prime

原題

技術分享圖片

http://acm.hdu.edu.cn/showproblem.php?pid=4135

題目大意

給定數字N,要求計算A到B區間內與N互質的整數的個數。

題目分析

這道題可以用容斥定理來解,先求N的質因數,再篩掉AB區間種是N的質因數的倍數的那些數,剩下的數就是與N互質的數了.求解質因數可以從i=2開始枚舉,到i*i<=N結束,只要N能被i整除,就把i加入到一個數組中,然後記得讓N不斷除i,這是為了去掉N中的質因數i.容斥定理我用的是遞歸寫法,具體可以看我代碼,遞歸寫法相對而言會比較簡潔.

代碼

 1 #include <cstdio>
 2 #include <cmath>
 3
#include <iostream> 4 #include <cstring> 5 #include <algorithm> 6 #include <vector> 7 #include <string> 8 #include <utility> 9 #include <queue> 10 #include <stack> 11 #include <map> 12 const int INF=0x3f3f3f3f; 13 using namespace std;
14 15 typedef long long LL; 16 LL prime[100005]; 17 int num; 18 19 void prime_get(LL n) //取素數 20 { 21 num=0; 22 for(LL i=2;i*i<=n;i++) 23 { 24 if(!(n%i)) prime[num++]=i; 25 while(!(n%i)) n/=i; 26 } 27 if(n>1) prime[num++]=n; 28 } 29 30 LL reject(LL x,int
k) //容斥定理 求出1至X區間與N不互質的數 31 { 32 LL res=0; 33 for(int i=k;i<num;i++) //在草稿紙上把這個過程展開就知道原理了 34 res=res+x/prime[i]-reject(x/prime[i],i+1); 35 return res; 36 } 37 38 int main() 39 { 40 int t; 41 cin>>t; 42 for(int i=1;i<=t;i++) 43 { 44 LL a,b,n; 45 cin>>a>>b>>n; 46 prime_get(n); 47 printf("Case #%d: ",i); 48 cout<<(b-reject(b,0))-(a-1-reject(a-1,0))<<endl; 49 } 50 return 0; 51 }

Co-prime HDU - 4135(題解)