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