码迷,mamicode.com
首页 > 其他好文 > 详细

[BZOJ2705][SDOI2012]Longge的问题 数学

时间:2017-10-08 11:20:50      阅读:128      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!