欧拉函数的题目,一脸懵逼。
公式:
∑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%4
using 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%4
using 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;
}