标签:sdoi math span type main ace blog std names
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2705
首先分析得题目所求$gcd(i,N)$的取值只可能是$N$的因子,则有$$Ans=\sum_{d|N}d\sum_{i=1}^N[gcd(i,N)==d]$$
$$Ans=\sum_{d|N}d\sum_{i=1}^{\frac{N}{d}}[gcd(i,\frac{N}{d})==1]$$
$$Ans=\sum_{d|N}dφ(\frac{N}{d})$$
我们可以枚举$N$的因子,然后用$O(\sqrt{N})$的时间求φ。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 using namespace std; 6 typedef long long ll; 7 ll N; 8 ll Phi(ll x){ 9 int M=floor(sqrt(x)); 10 ll ret=x; 11 for(int i=2;i<=M;i++){ 12 if(x%i==0){ 13 ret=ret/i*(i-1); 14 while(x%i==0) x/=i; 15 } 16 } 17 if(x>1) ret=ret/x*(x-1); 18 return ret; 19 } 20 int main(){ 21 scanf("%lld",&N); 22 int M=floor(sqrt(N)); 23 ll Ans=0; 24 for(int i=1;i<=M;i++){ 25 if(N%i==0){ 26 Ans+=Phi(N/i)*i; 27 if((ll)i*i<N) Ans+=Phi(i)*(N/i); 28 } 29 } 30 printf("%lld\n",Ans); 31 return 0; 32 }
[BZOJ2705][SDOI2012]Longge的问题 数学
标签:sdoi math span type main ace blog std names
原文地址:http://www.cnblogs.com/halfrot/p/7636572.html