bzoj 2705: [SDOI2012]Longge的问题 欧拉函数
2016-09-18 16:30
344 查看
Description
Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。Input
一个整数,为N。Output
一个整数,为所求的答案。Sample Input
6Sample Output
15HINT
【数据范围】对于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 long
using 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;
}
相关文章推荐
- 【BZOJ 2705】[SDOI2012]Longge的问题 欧拉函数
- bzoj2705[SDOI2012]Longge的问题 欧拉函数
- BZOJ 2705 SDOI2012 Longge的问题 因数分解+欧拉函数
- 【数论】【枚举约数】【欧拉函数】bzoj2705 [SDOI2012]Longge的问题
- BZOJ2705 [SDOI2012]Longge的问题(欧拉函数)
- BZOJ 2705([SDOI2012]Longge的问题-欧拉函数φ(i))
- 【欧拉函数】BZOJ2705 [SDOI2012]Longge的问题
- 【欧拉函数】BZOJ2705(SDOI2012)[Longge的问题]题解
- 【BZOJ 2705】【SDOI 2012】Longge的问题【欧拉函数】
- Bzoj 2705: [SDOI2012]Longge的问题 欧拉函数,数论
- BZOJ - 2705: [SDOI2012]Longge的问题 【欧拉函数 一道必做的经典题】
- BZOJ2705 [SDOI2012]Longge的问题 【欧拉函数】
- bzoj 2705 [SDOI2012]Longge的问题 欧拉函数
- bzoj 2705: [SDOI2012]Longge的问题 欧拉函数
- 【bzoj2705】[SDOI2012]Longge的问题 欧拉函数
- 【bzoj2705】[SDOI2012]Longge的问题 欧拉函数
- BZOJ 2705: [SDOI2012]Longge的问题 [欧拉函数]
- 【欧拉函数】BZOJ2705: [SDOI2012]Longge的问题
- [BZOJ 2705] SDOI 2012 Longge的问题 · 欧拉函数
- [BZOJ2705] [SDOI2012] Longge的问题 - 欧拉函数