[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 }

 

posted @ 2017-10-08 09:21  halfrot  阅读(118)  评论(0编辑  收藏  举报