您的位置:首页 > 其它

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).

代码如下:

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: