您的位置:首页 > 其它

HDU 4059 The Boss on Mars

2013-11-28 19:37 369 查看
做这个题目需要知道一个数学公式,1^4+2^4+3^4+...+n^4=1/5*n^5+1/2*n^4+1/3*n^3-1/30*n,然后容斥处理一下,就没有什么了。

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;
const int maxn=10010;
const long long  mod=1000000007;

bool is_prim[maxn];
int pn,prim[maxn];
int   n,a[20],an;
long long res;

void prime()
{
memset(is_prim,0,sizeof(is_prim));
pn=0;
is_prim[0]=1;
is_prim[1]=1;
for (int i=1;i<=10000;i++)
{
if (is_prim[i]==0)//prim[]存素数;
prim[pn++]=i;
for (int j=0;prim[j]*i<10000 && j<pn;j++)
{
is_prim[prim[j]*i]=1;
//factor[prim[j]*i]=prim[j];//factor[]存最小素因子;
if (i%prim[j]==0)
break;
}
}
}
void do_pre(int n)//找出n的所有质因子;
{
an=0;
int i=0;
while (n>1&&i<pn)
{
if (n%prim[i]==0)
{
an++;
a[an]=prim[i];
while (n%prim[i]==0) n/=prim[i];
}
i++;
}
if (n>1)
{
an++;
a[an]=n;
}
}

long long f(long long  n)//求1^4+2^4+3^4+...+n^4;
{
long long r[6];
r[0]=1;
for (int i=1;i<=5;i++)
r[i]=(r[i-1]*n)%(mod*30);
long long ans=((6*r[5]+15*r[4]+10*r[3]-r[1])/30)%mod;
return ans;
}
void work(long long ans,int p)
{
long long  num=(long long )n/ans;
long long k=f(num);
for (int i=1;i<=4;i++)
k=(k*ans)%mod;
res=res+k*p;
while (res<0) res+=mod;
res=res%mod;
}

void dfs(int k,int star,long long ans)
{
if (k%2)
work(ans,-1);
else work(ans,1);
for (int i=star;i<=an;i++)
dfs(k+1,i+1,ans*a[i]);
}
int main()
{
freopen("in.txt","r",stdin);
prime();
int t;
scanf("%d",&t);
while (t--)
{
res=0;
scanf("%d",&n);
do_pre(n);
dfs(0,1,1);
printf("%lld\n",res);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  容斥