【欧拉函数】BZOJ2705(SDOI2012)[Longge的问题]题解

来源:互联网 发布:天心软件 编辑:程序博客网 时间:2024/06/10 08:08

题目概述

ni=1(i,n)

解题报告

i=1n(i,n)=d|ndi=1nd[(i,nd)=1]=d|ndφ(nd)

然后暴枚因子求欧拉函数就可以了,效率不知道怎么证明,反正可以秒过:P。

示例程序

#include<cstdio>#include<cmath>using namespace std;typedef long long LL;LL n,ans;inline LL phi(LL n){    LL ans=n;    for (int i=2,S=sqrt(n);n>1&&i<=S;i++)        if (!(n%i)) {ans=ans/i*(i-1);while (!(n%i)) n/=i;}    if (n>1) ans=ans/n*(n-1);return ans;}int main(){    freopen("program.in","r",stdin);    freopen("program.out","w",stdout);    scanf("%lld",&n);ans=0;    for (int i=1,S=sqrt(n);i<=S;i++)        if (!(n%i)) {ans+=phi(n/i)*i;if (n/i>S) ans+=phi(i)*n/i;}    return printf("%lld\n",ans),0;}