AFO

[SDOi2012]Longge的问题

题目描述

Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。

\(\sum_{i=1}^n \gcd(i,n)\)可以写成\(\sum_{i|n}\varphi(i)\frac n i\)

然后暴力算一下就可以通过本题了

(吐槽数据范围\(n\leq 2^{32}\)!!!!)

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long 
using namespace std;

int a[100001],tp;
LL res,n,s;

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

int main()
{
	scanf("%lld",&n);
	s=sqrt(n);
	for(LL i=1;i<=s;i++) if(n%i==0) 
	{
		res+=(LL)phi(i)*n/i;
		if(i*i==n) break;
		res+=(LL)phi(n/i)*i;
	}
	printf("%lld",res);
}
posted @ 2019-09-08 20:25  ZUTTER☮  阅读(149)  评论(0编辑  收藏  举报