bzoj 2705: [SDOI2012]Longge的问题 欧拉函数

来源:互联网 发布:黑客论坛数据库下载 编辑:程序博客网 时间:2024/05/29 18:04

Description

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

Input

一个整数,为N。

Output

一个整数,为所求的答案。

Sample Input

6

Sample Output

15

HINT

【数据范围】

对于60%的数据,0<N<=2^16。

对于100%的数据,0<N<=2^32。


分析:对于n的某个约数k,满足gcd(n,i)=k的i个数量为phi(n/k)

因为i的数量可以转化为求满足gcd(n/k,j)=1且j<n/k的j的数量,即phi(n/k)

那么我们只要对n的每个约数进行统计就好了


代码:

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<cmath>#define ll long longusing namespace std;int getphi(int n){if (n==1) return 1;int phi=n;for (int i=2;i<=(int)sqrt(n);i++)if (n%i==0){phi=phi/i*(i-1);while (n%i==0) n/=i;}if (n>1) phi=phi/n*(n-1);return phi;}int main(){int n;scanf("%d",&n);ll ans=0;int x=(int)sqrt(n);for (int i=1;i<=x;i++)if (n%i==0) ans+=(ll)getphi(i)*n/i+(ll)getphi(n/i)*i;if (x*x==n) ans-=(ll)getphi(x)*x;printf("%lld",ans);return 0;}



0 0
原创粉丝点击