[SDOI2012]Longge的问题 phi运用
2017-09-08 23:00
381 查看
大体思路见过,但是已经模糊了,复习一下
要求sigma(gcd(n,i)),1<=i<=n
枚举因子x,gcd(i,n)==x,要知道ii的个数
即是gcd(i/x,n/x)==1的个数,这可以用phi(n/x)求出有多少个i/x
要求sigma(gcd(n,i)),1<=i<=n
枚举因子x,gcd(i,n)==x,要知道ii的个数
即是gcd(i/x,n/x)==1的个数,这可以用phi(n/x)求出有多少个i/x
#include<bits/stdc++.h> #include<stdio.h> #include<algorithm> #include<queue> #include<string.h> #include<iostream> #include<math.h> #include<set> #include<map> #include<vector> #include<iomanip> using namespace std; #define ll long long #define ull unsigned long long #define pb push_back #define FOR(a) for(int i=1;i<=a;i++) const int inf=0x3f3f3f3f; const ll Linf=9e18; const int maxn=1e5+7; const ll mod=100003; const double eps=1e-6; ll n,ans; int m; ll eular(ll n){ ll ans=n; for(int i=2;i<=m;i++){ if(n%i==0){ ans-=ans/i; while(n%i==0)n/=i; } } if(n>1)ans-=ans/n; return ans; } int main(){ scanf("%lld",&n); m=sqrt(n); for(int i=1;i<=m;i++){ if(n%i==0){ if(n/i==i){ ans+=i * eular(n/i); }else{ ans+=i * eular(n/i) + n/i * eular(i); } } } printf("%lld\n",ans); }
相关文章推荐
- bzoj2075[SDOI2012]Longge的问题
- [SDOI2012]Longge的问题
- 【SDOI2012】Longge的问题
- bzoj 2705: [SDOI2012]Longge的问题
- bzoj2705[SDOI2012]Longge的问题
- [欧拉函数]Bzoj2705 Longge的问题[SDOI2012]
- [BZOJ2705] [SDOI2012] Longge的问题 - 欧拉函数
- BZOJ2705: [SDOI2012]Longge的问题
- BZOJ 2705 [SDOI2012]Longge的问题
- BZOJ 2705: [SDOI2012]Longge的问题( 数论 )
- BZOJ.2705.[SDOI2012]Longge的问题(莫比乌斯反演 欧拉函数)
- 【bzoj】2705 - [SDOI2012]Longge的问题(欧拉函数)
- BZOJ 2705([SDOI2012]Longge的问题-欧拉函数φ(i))
- BZOJ_P2705 [SDOI2012]Longge的问题(数论+欧拉函数)
- 洛谷P2303 [SDOi2012]Longge的问题
- bzoj2705[SDOI2012]Longge的问题
- 2705: [SDOI2012]Longge的问题
- 2705: [SDOI2012]Longge的问题 欧拉函数
- SDOI2012Longge的问题
- 2705: [SDOI2012]Longge的问题