1. 程式人生 > >[BZOJ2705][SDOI2012]Longge的問題 數學

[BZOJ2705][SDOI2012]Longge的問題 數學

floor names += algorithm ace 時間 ++ algo pac

題目鏈接: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的問題 數學