poj 2480 Longge's problem 积性函数
2013-09-26 11:56
288 查看
思路:首先给出几个结论:
1.gcd(a,b)是积性函数;
2.积性函数的和仍然是积性函数;
3.phi(a^b)=a^b-a^(b-1);
记 f(n)=∑gcd(i,n),n=p1^e1*p2^e2……;
则 f(n)=∑d*phi(n/d) (d是n的约数)
=∑(pi*ei+pi-ei)*pi^(ei-1).
代码如下:
View Code
1.gcd(a,b)是积性函数;
2.积性函数的和仍然是积性函数;
3.phi(a^b)=a^b-a^(b-1);
记 f(n)=∑gcd(i,n),n=p1^e1*p2^e2……;
则 f(n)=∑d*phi(n/d) (d是n的约数)
=∑(pi*ei+pi-ei)*pi^(ei-1).
代码如下:
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<set> #include<vector> #define ll __int64 #define M 50005 #define inf 1e10 #define mod 1000000007 using namespace std; int prime[M],cnt; bool f[M]; void init() { cnt=0; memset(f,0,sizeof(f)); for(int i=2;i<M;i++){ if(!f[i]) prime[cnt++]=i; for(int j=0;j<cnt&&i*prime[j]<M;j++){ f[i*prime[j]]=1; if(i%prime[j]==0) break; } } } ll pows(ll a,ll b) { ll ans=1; while(b){ if(b&1) ans*=a; b>>=1; a*=a; } return ans; } ll dfs(ll n) { ll ans=1,j; for(int i=0;i<cnt&&prime[i]*prime[i]<=n;i++){ if(n%prime[i]==0){ j=1; n/=prime[i]; while(n%prime[i]==0){ j++; n/=prime[i]; } ans*=(ll)(prime[i]*j-j+prime[i])*pows(prime[i],j-1); } } if(n>1) ans*=(ll)(2*n-1); return ans; } int main() { ll n; init(); while(scanf("%I64d",&n)!=EOF){ printf("%I64d\n",dfs(n)); } return 0; }
View Code
相关文章推荐
- POJ-2480 Longge's problem 积性函数
- poj2480 Longge's problem ——积性函数入门题
- POJ 2480 Longge's problem 积性函数
- poj 2480 Longge's problem [ 欧拉函数 ]
- poj 2480 Longge's problem 积性函数性质+欧拉函数
- poj 2480 Longge's problem 欧拉函数+素数打表
- POJ 2480 Longge's problem 欧拉函数的应用 积性函数
- POJ 2480 Longge's problem 积性函数
- POJ 2480 Longge's problem (积性函数,欧拉函数)
- POJ 2480 Longge's problem 欧拉函数—————∑gcd(i, N) 1<=i <=N
- POJ-2480 Longge's problem 欧拉函数
- POJ 2480 Longge's problem(欧拉函数,积性函数)
- POJ 2480 Longge's problem [ 求 Σgcd(i,n)(1<=i<=n) ] [欧拉函数]
- POJ 2480 Longge's problem(积性函数之欧拉函数与gcd)
- POJ 2480 积性函数欧拉函数,数学的魅力所在~
- POJ2480 Longge's problem
- POJ 2480 Longge's problem 解题报告(欧拉函数 + 积性函数)
- poj 2480 Longge's problem(积性函数 & 欧拉函数)
- poj 2480 Longge's problem(欧拉函数或积性函数)
- POJ-2480 Loangge's problem