bzoj 2705 //2705: [SDOI2012]Longge的问题 //在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=2705
更多题解,详见https://blog.csdn.net/mrcrack/article/details/90228694BZOJ刷题记录
900 kb | 56 ms | C++ | 694 B |
//2705: [SDOI2012]Longge的问题
//在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=2705
//题意清晰,纯数学问题。
//枚举显然超时,N<=2^32,需采用unsigned int
//此文https://www.luogu.org/problemnew/solution/P2303?page=3 作者: xyz32768 更新时间: 2017-10-22 10:56思路不错,摘抄如下
/*
*/
//不熟悉欧拉函数的可看看此文https://blog.csdn.net/ydd97/article/details/47805419内容,部分摘抄如下
/*
欢迎各位读者指出不足,谢谢~
首先我们要知道欧拉函数是个什么东东?
废话不多说~欧拉函数就是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) 。
欧拉函数的通式:φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pn),其中p1, p2……pn为n的所有质因数,n是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)。
对于上述的通式一定要牢记在心,因为这是计算欧拉函数最重要的一步。 切记切记~~~~
*/
//sqrt(2^32)=2^16=2^6*2^10=64*1024=6.4*10^4
//样例通过,提交AC。2019-10-27 19:27
#include
#define LL long long
#define maxn 10010
int a[maxn],prime[maxn],cnt,tot;
LL n;
LL phi(LL x){
LL ret;
int i;
tot=0,ret=x;
for(i=2;1LL*i*i<=x;i++)
if(x%i==0){
prime[++tot]=i;
while(x%i==0)x/=i;//约去重复的质因数。
}
if(x>1)prime[++tot]=x;//x值要么是1,要么是w
for(i=1;i<=tot;i++)ret/=prime[i],ret*=prime[i]-1;
return ret;
}
int main(){
int i;
LL ans=0;
cnt=0;
scanf("%lld",&n);
for(i=1;1LL*i*i<=n;i++)
if(n%i==0){
a[++cnt]=i;
if(i!=n/i)a[++cnt]=n/i;
}
for(i=1;i<=cnt;i++)ans+=a[i]*phi(n/a[i]);
printf("%lld\n",ans);
return 0;
}