hdu 6053 TrickGCD 反演

版权声明:本文为博主原创文章,转载请附上原博客链接。 https://blog.csdn.net/Dale_zero/article/details/82468017

题目链接;http://acm.hdu.edu.cn/showproblem.php?pid=6053

最后减得时候可能会小于0所以要加模

#include<bits/stdc++.h>
#include<math.h>
#define MOD  1000000007
#define For(i,m,n) for(int i=m;i<=n;i++)
#define LL long long
#define inf 0x3f3f3f3f
#define lan(a,b) memset(a,b,sizeof(a))
#define sqr(x) (x*x)
using namespace std;


long long power(long long a,long long b)//a的b次幂
{
    long long ans=1;
    while(b)
    {
        if(b&1)
            ans=(a*ans)%MOD;
        b>>=1;
        a=(a*a)%MOD;
    }
    return ans;
}


const int maxn=1e5+5;
LL mu[maxn],pri[maxn],tot=0;
LL smu[maxn];///前缀和
bool zs[maxn];
void Getmu()
{
    int n=maxn-1;
    zs[1]=true;mu[1]=1;
    for(LL i=2;i<=n;++i)
    {
        if(!zs[i]){pri[++tot]=i;mu[i]=-1;}
        for(LL j=1;j<=tot&&i*pri[j]<=n;++j)
        {
            zs[i*pri[j]]=true;
            if(i%pri[j])mu[i*pri[j]]=-mu[i];
            else{mu[i*pri[j]]=0;break;}
        }
    }
    for(int i=1;i<=n;++i)smu[i]=(smu[i-1]+mu[i]+MOD)%MOD;
}
LL a[maxn];
LL sum[maxn];

LL maxx=0,minn=inf;

LL pin()
{
    maxx++;
    LL ans=0;
    For(i,1,minn)
    {
        LL tem=mu[i];
        if(tem==0)
            continue;
        for(LL j=i;j<maxx;j+=i)
        {
            tem%=MOD;
            tem*=power(j/i,(sum[min(j+i,maxx)-1]-sum[j-1]));
        }
        ans+=tem;
        ans%=MOD;
    }
    return ans;
}
int main()
{
    Getmu();
    int t;
    scanf("%d",&t);
    For(tt,1,t)
    {
        int n;
        lan(a,0);
        lan(sum,0);
        scanf("%d",&n);
        maxx=0,minn=inf;
        LL x;
        For(i,1,n)
            scanf("%lld",&x),maxx=max(maxx,x),minn=min(minn,x),sum[(int)x]++;
       for(int i=1;i<maxn;i++)
            sum[i]+=sum[i-1];//printf("sum%d=%lld\n",i,sum[i]);
        LL ans=pin();
        LL tem=1;
        for(int i=1;i<maxn;i++)
        {
            tem*=power(i,sum[i]-sum[i-1]);
            tem%=MOD;
        }
        printf("Case #%d: %lld\n",tt,(tem-ans+MOD)%MOD);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Dale_zero/article/details/82468017