[BZOJ2705][SDOI2012]Longge的问题 数学
Posted halfrot
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[BZOJ2705][SDOI2012]Longge的问题 数学相关的知识,希望对你有一定的参考价值。
题目链接: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的问题 数学的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ 2705: [SDOI2012]Longge的问题
Bzoj 2705: [SDOI2012]Longge的问题 欧拉函数,数论