HDU 4059 The Boss on Mars

做这个题目需要知道一个数学公式,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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值