1. 程式人生 > >【藍橋杯】互質數個數

【藍橋杯】互質數個數

#include<iostream>
#include<bits/stdc++.h>
using namespace std;

int ans[100000];
int main()
{
    long long n;
    cin>>n;
    long long N=n;
    int pos=-1;
    for(int i=2;i*i<=n;i++)
    {
        if(n%i==0) ans[++pos]=i;
        while(n%i==0) n=n/i;
    }
    if(n>1) ans[++pos]=n;
    int res=N;
    for(int i=0;i<=pos;i++)
    {
        res=res-res/ans[i];
    }
    cout<<res;
    return 0;
}

這道題資料太大不應用篩法,應該對n分解質因數,從2試除到sqrt(n),如果遇到可以整除的那就是n的質因子,把它除乾淨,如果最後剩下一個大於1的數,那就是最大的質因子,有了所有的質因子以後就可以套尤拉公式了。

用尤拉函式公式也是先分解質因數,比方說12=2*2*3,質因子是2和3,那答案就是12*(1-1/2)*(1-1/3)=4,再比方說36=2*2*3*3,那麼質因子是2和3,答案是36*(1-1/2)*(1-1/3)=12。而程式碼中第一個for迴圈的過程就是在分解質因數。

(注意過程中是在n上操作,所以要先用N來儲存初始n值)