【藍橋杯】互質數個數
阿新 • • 發佈:2019-01-30
#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值)