记录编号 40692 评测结果 AAAAAAAAAA
题目名称 [河南省队2012] 最大公约数和 最终得分 100
用户昵称 Gravatar了反取字名我擦 是否通过 通过
代码语言 C++ 运行时间 0.005 s
提交时间 2012-07-18 16:40:45 内存使用 2.08 MiB
显示代码纯文本
#include<fstream>
#include<string>
#include<algorithm>
#include<cmath>

using namespace std;
ifstream fi("gcdsum.in");
ofstream fo("gcdsum.out");

long long ans2=0,n;
long long prime[100000]={0},p=0;
bool fg[1048577]={0};
long long eular(int k)
{
	int ans=k;
	for(int i=0;i<p&&prime[i]*prime[i]<=k;i++)
	{
		if(k%prime[i]==0)
		{
			ans=ans/prime[i]*(prime[i]-1);
			while(k%prime[i]==0)
				k/=prime[i];
		}
	}
	if(k>1)
		ans=ans/k*(k-1);
	return ans;
}
int main()
{
	fi>>n;
	for(long long i=2;i*i<=n;i++)
	{
		if(!fg[i])
		{
			prime[p++]=i;
			for(long long j=2*i;j*j<=n;j+=i)
				fg[j]=1;
		}
	}
	for(long long i=1;i*i<=n;i++)
		if(n%i==0)
        {
            if(i*i==n)
            {
                ans2+=eular(i)*i;
                break;
            }
            ans2+=eular(i)*n/i;
            ans2+=eular(n/i)*i;
        }
	fo<<ans2;
	fi.close();
	fo.close();
	return 0;
}