【思路】:本来是TLE的,但看了讨论区,发现要用到欧拉函数(在数论中用于求解 [ 1 , n ] 中与 n 互质数个数 的函数),但欧拉开头的东东就有挺多的,这里用到的是单个数的那种欧拉函数的板子,这里给你一个通式:
求单个数的欧拉函数的板子:
//本题数据较大,所以板子用long long
typedef long long ll;
ll Eular(ll m)
{
ll i;
ll res=m;
for(i=2;i*i<=m;i++)
{
if(m%i==0)
{
res-=res/i;
while(m%i==0)
m/=i;
}
}
if(m>1)
res-=res/m;
return res;
}
给出一个n,求1-n这n个数,同n的最大公约数的和。比如:n = 6
1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15
收起
输入
1个数N(N <= 10^9)
输出
公约数之和
输入样例
6
输出样例
15
ac代码:
#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<set>
#include<cmath>
using namespace std;
typedef long long ll;
const ll maxn=1e6+7;
ll Eular(ll m)
{
ll i;
ll res=m;
for(i=2;i*i<=m;i++)
{
if(m%i==0)
{
res-=res/i;
while(m%i==0)
m/=i;
}
}
if(m>1)
res-=res/m;
return res;
}
int main()
{
ll i,n;
cin>>n;
ll ans=0;
for(i=1;i*i<=n;i++)
{
if(n%i==0){
ans+=Eular(n/i)*i;
if(n!=i*i)
ans+=Eular(i)*(n/i);
}
}
cout<<ans<<endl;
return 0;
}