原題
題目描述
給定整數(shù)n,求n的歐拉函數(shù)的值
輸入
多組數(shù)據(jù) 每行一個整數(shù),表示n( 1 <= n <= 1,000,000,000) 一個0,表示輸入結(jié)束
輸出
每行輸入一個整數(shù),表示對應(yīng)的n的歐拉函數(shù)值
樣例輸入
7 12 0
樣例輸出
6 4
分析
要解決這道題,我們先來了解什么是歐拉函數(shù)和歐拉定理。
歐拉函數(shù)φ:不超過n的且與n互質(zhì)的正整數(shù)的個數(shù)。 如果n為素數(shù)p,則φ(p)=p?1 如果n為素數(shù)p的冪次pa,則φ(pa)=(p?1)?pa?1. 歐拉函數(shù)為積性函數(shù):如果n為任意兩個互質(zhì)的數(shù)a、b的積,則φ(n)=φ(a)?φ(b)
n=p1a1?p2a2?……?pkak 則φ(n)=n?(1?1/p1)?(1?1/p2)?……?(1?1/pk)
歐拉定理: 若a與m互質(zhì),則aφ(m)≡1(mod m)
所以,我們就得出了歐拉計(jì)算函數(shù)。
int euler(int n){ int m=int(sqrt(n+0.5)),ans=n; for(int i=2;i<=m;i++) if(n%i==0){ ans=ans/i*(i-1); while(n%i==0) n/=i; } if(n>1) ans=ans/n*(n-1); return ans;}源代碼
#include<iostream>#include<cstdio>#include<cmath>using namespace std;int euler(int n){ int m=int(sqrt(n+0.5)),ans=n; for(int i=2;i<=m;i++) if(n%i==0){ ans=ans/i*(i-1); while(n%i==0) n/=i; } if(n>1) ans=ans/n*(n-1); return ans;}int main(){ int x; while(scanf("%d",&x)&&x)