標籤:
解題思路:求[a,b]區間內與n互質的數的個數,我們可以轉化為[1,b]內與n互質的數的個數減去[1,a-1]內與n互質的數的個數
而要求[1,b]內與n互質的數的個數,我們可以很自然地想到容斥原理
求解區間[a,b]中與k互質的個數
首先對k進行質數分解,然後與這個因子GCD!=1則共有n/ki個
有計算重複的部分,因此利用 容斥原理: k1+k2+k3-k1*k2-.....求出與k不互質的個數,用總的減去即可
Description給定你一個數n,請你統計出在[a,b]這個區間中和n互質的數的個數。兩個數互質若且唯若他們除了1之外沒有其他的公用因子或者他們最大的公用因子是1。1和任何數是互素的。Input第一行輸入一個整數T(1 <= T <= 100),表示T組測試資料。接下來T行,每行3個整數a,b,n(1 <= a <=b <=10^15, 1<= n <= 10^9),用空格隔開。Output輸出一個整數表示和n互質的數的個數。Sample Input
21 10 23 10 5
Sample Output
56
<pre name="code" class="cpp">#include<stdio.h>#include<iostream>#include<string.h>using namespace std;long long s[1020],k;void prime(long long m)//求一個數的素因子{ long long i; k=0; for(i=2;i*i<=m;i++) { if(m%i==0) { s[k++]=i; while(m%i==0) m/=i;//printf("%d\n",m); } } if(m>1) s[k++]=m; //printf("###\n");}long long quc(long long m)//隊列數組實現容斥原理{ long long p[10020],i,j,t=0,sum=0,z; p[t++]=-1; for(i=0;i<k;i++) { z=t; for(j=0;j<z;j++) { p[t++]=p[j]*s[i]*(-1); } } for(i=1;i<t;i++) sum+=m/p[i]; return sum;}int main(){ long long n; scanf("%lld",&n); while(n--) { long long a,b,m,sum; scanf("%lld %lld %lld",&a,&b,&m); prime(m); sum=b-quc(b)-(a-1)+quc(a-1); printf("%lld\n",sum); }}
給定你一個數n,找出在[a,b]這個區間中和n互質的數的個數。