http://acm.hdu.edu.cn/showproblem.php?pid=4059
题意:
给出n,n<=1e8
求1到n里,所有与n互质的数的四次方和
在这里直接考虑,1+....n^4 减去 所有与n不互质的数的4次方
首先我们分解n的质因子,不会很多个
根据容斥原理,
我们枚举 质因子集合S,
那么得到k=n/s,为s的倍数的个数,
而这部分数的四次方和的贡献显然是 k^4(1+2^4+3^4+......x^4)
然后容斥一下就好了,关键是推公式...233智商低 不会推,暴力拉格朗日插一下,
插出1+...n^4= (6*n^5+15n^4+3n^10)/30
求一下30的逆元就可以o1算出答案了。
#include<bits/stdc++.h>
using namespace std;
long long p[15];
int tot;
long long n;
const long long mod=1e9+7;
const long long mm=233333335;
long long get4(long long x)
{
long long tmp=x*x % mod;
return tmp * tmp % mod;
}
long long f(long long x)
{
long long sum=0;
long long tmp3=x * x % mod * x % mod;
sum=(sum+tmp3*10) %mod;;
long long tmp4=tmp3*x % mod;
sum=(sum+tmp4*15 % mod) % mod;
long long tmp5=tmp4*x % mod;
sum=(sum+tmp5*6 % mod) % mod;
sum=(sum-x+mod)% mod;
long long ans=sum * mm % mod;
return ans;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("output.txt","w",stdout);
int tt; scanf("%d",&tt);
while (tt--)
{
scanf("%lld",&n);
long long nn=n;
tot=0;
for (long long i=2; i*i<=n; i++)
{
if (nn % i==0)
{
while (nn % i==0)
nn/=i;
p[tot++]=i;
}
}
if (nn>1)
p[tot++]=nn;
/*for (int i=0; i<tot; i++)
printf("%d ",p[i]);*/
long long ans=0;
for (int state=1; state<(1<<tot); state++)
{
int num=0;
long long pp=1;
for (int i=0; i<tot; i++)
if (state & (1<<i))
{
num++;
pp*=p[i];
}
long long k=n/pp;
long long tmp=get4(pp)*f(k) % mod;
if (num % 2)
ans+=tmp;
else ans-=tmp;
ans=ans % mod;
}
ans=f(n)-ans;
ans=(ans+mod)%mod;
printf("%lld\n",ans);
}
return 0;
}