欧拉函数(codevs 4939)

题目描述 Description

输入一个数n,输出小于n且与n互素的整数个数

输入描述 Input Description

包含多组数据,n=0时结束

测试数据组数不会很多,不必先打表后输出

输出描述 Output Description

一组数据一行

样例输入 Sample Input

364684

346

5432

11

24

0

2333333

233333333

0

233333333333333

2333333333333333333333333333333333333333333333333

 

样例输出 Sample Output

165120

172

2304

10

8

数据范围及提示 Data Size & Hint

1<n<9223372036854775807

注意细节的优化,否则第九组数据可能超时

//网上的模板
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    long long n,m,ans;
    while(cin>>n&&n!=0)
    {
        ans=n;
        if(n%2==0)//只搜n/2次,不然可能超一组 (也可能不超)
            {
                while(n%2==0) n/=2;
                ans=ans/2;
            }
        for(long long i=3;i*i<=n;i+=2)
        //每找到一个就更改上界,这个优化很多,所以直接copy刘汝佳的代码会超时
        {
            if(n%i==0)
            {
                while(n%i==0) n/=i;
                ans=ans/i*(i-1);
            }
        }
        if(n>1) ans=ans/n*(n-1);
        cout<<ans<<endl;
        }
    return 0;
}
View Code

 

posted @ 2016-07-10 13:32  karles~  阅读(278)  评论(2编辑  收藏  举报