給定你一個數n,找出在[a,b]這個區間中和n互質的數的個數。

來源:互聯網
上載者:User

標籤:

    

解題思路:求[a,b]區間內與n互質的數的個數,我們可以轉化為[1,b]內與n互質的數的個數減去[1,a-1]內與n互質的數的個數

而要求[1,b]內與n互質的數的個數,我們可以很自然地想到容斥原理

求解區間[a,b]中與k互質的個數 
首先對k進行質數分解,然後與這個因子GCD!=1則共有n/k
i個

有計算重複的部分,因此利用 容斥原理: 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互質的數的個數。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.