51nod1262 扔球(尤拉函式)

bigbigship發表於2014-09-25

題目連結:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1262

題意;從圓上一點扔一個球,經過n次反彈第一次回到起點;

分析:

設地點為S,經過n次反彈回到起點S 則說明走過了n+1條邊

設每次可以走a條邊 則 GCD(a,n+1)=1  LCM(a,n+1)=a*(n+1);即a,n+1互質;

反證:若GCD(a,n+1)=d,LCM(a,n+1)=a*(n+1)/d;則說明每步最少要走(n+1)/d條邊,

經過(n+1)/d-1此反彈回到起點 (n+1)/d-1<n (d>=2)時,  因此題目的方案數即為1,n+1內

有多少個數與n+1互質,即n+1的尤拉函式值。

程式碼如下:

#include <iostream>

using namespace std;

int phi(int n)
{
    int rea = n;
    for(int i=2;i*i<=n;i++){
        if(n%i==0){
            rea =rea - rea / i;
            while(n%i==0)
                n/=i;
        }
    }
    if(n>1)
        rea= rea - rea / n;
    return rea;
}
int main()
{
    int n;
    while(cin>>n){
        cout<<phi(n+1)<<endl;
    }
    return 0;
}



相關文章