现在的位置: 首页 > 综合 > 正文

POJ 2480 欧拉函数的运用

2017年11月23日 ⁄ 综合 ⁄ 共 597字 ⁄ 字号 评论关闭

题目链接:http://poj.org/problem?id=2480

这个题我很早就提交过了,但是之前不知到是哪儿膜拜来的代码。。

今天别人问我,我又回去看了看,发现这个题目已经不是那么难了

按照自己的思路写了写,先开始一直莫名的TLE,后来把n为素数的情况特判了一下

于是就360MS卡过去了。。。

我的代码:

#include<stdio.h>
typedef long long LL;

LL num[70000];

LL eular(LL n)
{
	LL i,ret=1;
	for(i=2;i*i<=n;i++)
	{
		if(n%i==0)
		{
			n=n/i;
			ret=ret*(i-1);
			while(n%i==0)
			{
				n=n/i;
				ret=ret*i;
			}
		}
	}
	if(n>1)
		ret=ret*(n-1);
	return ret;
}

int main()
{
	LL i,n,k,ans;
	while(scanf("%lld",&n)!=EOF)
	{
		k=0,ans=0;
		for(i=1;i*i<n;i++)
		{
			if(n%i==0)
			{
				num[k++]=i;
				num[k++]=n/i;
			}
		}
		if(i*i==n)
			num[k++]=i;
		if(k==2)
		{
			printf("%lld\n",2*n-1);
			continue;
		}
		for(i=0;i<k;i++)
			ans=ans+num[i]*eular(n/num[i]);
		printf("%lld\n",ans);
	}
	return 0;
}

抱歉!评论已关闭.