POJ2480(欧拉函数)

来源:互联网 发布:js引用高德地图 编辑:程序博客网 时间:2024/06/07 16:19

欧拉函数的题目,一脸懵逼。
公式:

i=1ngcd(i,n)=d|ndφ(nd)

既然都有了公式,剩下的嘿嘿嘿
蜜汁TLE
为什么不加等于2的判断就超时了????
很不理解。。。
AC code:

#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#include<iostream>#include<string>#include <set>#include<time.h>//a&3==a%4using namespace std;#define ll long long#define mem(a) memset(a,0,sizeof(a))const double eps=1e-8;const int maxn=300010;//须填写const int inf=0x3f3f3f3f;ll eular(ll n){    ll ans=n;    for(int i=2;i*i<= n;i++)    {        if(n%i == 0)        {            ans-=ans/i;            while(n%i == 0)                n/=i;        }    }    if(n > 1)        ans-= ans/n;    return ans;}ll num[maxn];int main(){    ll a;    ll res=0;    ll i;    ll t=0;    while(cin>>a)    {        res=0;        t=0;        for(i=1;i*i <= a ;i++)        {            if(i*i == a)                num[t++]=i;            else if(a%i==0)            {                num[t++]=i;                num[t++]=a/i;            }        }        if(t==2)        {            cout<<a*2-1<<endl;            continue;        }        for(i=0;i<t;i++)            res+=num[i]*eular(a/num[i]);        cout<<res<<endl;    }    return 0;}

TLE代码:

#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#include<iostream>#include<string>#include <set>#include<time.h>//a&3==a%4using namespace std;#define ll long long#define mem(a) memset(a,0,sizeof(a))const double eps=1e-8;const int maxn=300010;//须填写const int inf=0x3f3f3f3f;ll eular(ll n){    ll ans=n;    for(int i=2;i*i<= n;i++)    {        if(n%i == 0)        {            ans-=ans/i;            while(n%i == 0)                n/=i;        }    }    if(n > 1)        ans-= ans/n;    return ans;}ll num[maxn];int main(){    ll a;    ll res=0;    ll i;    ll t=0;    while(cin>>a)    {        res=0;        t=0;        for(i=1;i*i <= a ;i++)        {            if(i*i == a)                num[t++]=i;            else if(a%i==0)            {                num[t++]=i;                num[t++]=a/i;            }        }        for(i=0;i<t;i++)            res+=num[i]*eular(a/num[i]);        cout<<res<<endl;    }    return 0;}
原创粉丝点击