首页 写随笔

cdcq(本博客废弃!现用博客:https://www.cnblogs.com/cdcq/)

本博客废弃!现用博客:https://www.cnblogs.com/cdcq/

导航

【BZOJ2705】【SDOI2012】Longge的问题

啥都不会只能学数论QAQ

原题:

Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。

0<N<=2^32

 

先知道是欧拉函数,然后照着反演推了半天,越推越鬼畜,然后gg看题解……

数论嘛,推公式:

对就这么简单

然后O(√n)求欧拉函数即可,其实就是用通式暴力计算……φ(x)=x*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pn)

注意暴力计算的时候不能用积性性质,因为欧拉函数的积性要求互质

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 #define ll long long
 8 ll n,m;
 9 ll phi(ll x){
10     ll tmp=x;
11     for(int i=2;i<=m;++i)if(!(x%i)){
12         tmp=tmp/i*(i-1);
13         while(!(x%i))  x/=i;
14     }
15     if(x>1)  tmp=tmp/x*(x-1);
16     return tmp;
17 }
18 int main(){//freopen("ddd.in","r",stdin);
19     cin>>n;
20     m=(ll)sqrt(n*1.0);
21     ll ans=0;
22     for(int i=1;i<=m;++i)if(!(n%i)){
23         ans+=(ll)i*phi(n/i);
24         if(i*i<n)  ans+=(ll)(n/i)*phi(i);
25     }
26     cout<<ans<<endl;
27     return 0;
28 }
View Code

 

posted on 2017-05-27 09:34  cdcq_old  阅读(140)  评论(0编辑  收藏  举报