分析 : 四次方和公式,加容斥。将问题转化为总和减去不互质的所有的四次方和。
注意事项:不一定最大的数据会出错(溢出,爆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; }