分析 : 四次方和公式,加容斥。将问题转化为总和减去不互质的所有的四次方和。
注意事项:不一定最大的数据会出错(溢出,爆ll等),多测一测,比如这道题我第一遍的代码1e8没错,1e7甚至420这种数据反而爆了,所以不一定最大的数据过了就不是溢出导致的wa。注意辨认容斥的状态到底需不需要第一个(全部都不要)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
ll inv,v[10004];
vector<ll> p,prime;
ll ksm(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1) ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
void isprime(ll n)
{
for(ll i=2;i<=n;i++) {
if(!v[i]) {
v[i]=i; prime.push_back(i);
}
for(int j=0;j<prime.size();j++) {
if(prime[j]>v[i]||prime[j]*i>n) break;
v[i*prime[j]]=prime[j];
}
}
}
ll cal(ll n)
{
return n*(n+1)%mod*(2*n+1)%mod*(((3*n*n%mod+3*n)%mod+mod-1)%mod)%mod*inv%mod;
}
ll rongchi(ll n)
{
ll ans=0,mul,cnt,num;
for(int i=1;i<(1<<p.size());i++) {
mul=1,cnt=0;
for(ll j=0;j<p.size();j++)
if(i&(1<<j)) {
cnt++;
mul*=p[j];
}
num=n/mul;
if(cnt&1) ans=(ans+mul*mul%mod*mul%mod*mul%mod*cal(num)%mod)%mod;
else ans=(ans+mod-mul*mul%mod*mul%mod*mul%mod*cal(num)%mod)%mod;
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
inv=ksm(30,mod-2);
isprime(10003);
while(t--)
{
p.clear();
ll n,x;
scanf("%lld",&n);
x=n;
for(int i=0;i<prime.size()&&prime[i]*prime[i]<=x;i++) {
if(x%prime[i]==0) {
p.push_back(prime[i]);
while(x%prime[i]==0) x/=prime[i];
}
}
if(x>1) p.push_back(x);
ll ans=(cal(n)+mod-rongchi(n))%mod;
printf("%lld\n",ans);
}
return 0;
} 
京公网安备 11010502036488号