版权声明:本文为博主原创文章,转载请附上原博客链接。 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;
}