//求1到n之间与n互质的数的四次方的和 //segma(n^4) = (6n^5+15n^4+10n^3-n)/30 //对于(a/b)%mod能够转化为(a*inv(b))%mod //inv(b)为b的逆元 //由费马小定理a^(p-1) = 1(modp) a , p 互质可得 //30的逆元为30^(mod-2) //由容斥原理非常easy得到与n不互质的数之和为 //对于全部的n的素数因子 //一个素数因子的全部数的四次方之和-有两个素数因子的全部数的四次方之和+有三个。
。。。
//然后用总的减去不互质的即为互质的 #include<cstdio> #include<iostream> #include<cstring> using namespace std ; const int maxn = 1010 ; typedef __int64 ll ; const __int64 mod = 1e9+7 ; int p[maxn] ; int len ; ll inv ; void get_prime(ll n) { len = 0 ; for(int i = 2;i*i <= n;i++) { if(n%i == 0)p[++len] = i; while(n%i==0)n/=i ; } if(n>1)p[++len] = n ; } ll Pow(ll a , ll b) { ll c = 1 ; while(b) { if(b&1)c = (c*a)%mod; a = (a*a)%mod; b >>= 1; } return c ; } ll dfs(int pos , int n) { ll ans = 0 ; for(int i = pos;i <= len ;i++) { ll t = n/p[i] ; ll t_1 = ((((6*Pow(t,5) + 15*Pow(t,4) + 10*Pow(t,3) - t))%mod)*inv)%mod; ans = (ans + (Pow(p[i] , 4)*(t_1- dfs(i+1 , n/p[i]))))%mod; } return ans ; } int main() { int T ; scanf("%d" , &T) ; inv = Pow(30 , mod - 2) ; while(T--) { ll n ; scanf("%I64d" , &n) ; get_prime(n) ; ll ans = (((((6*Pow(n,5) + 15*Pow(n,4) + 10*Pow(n,3) - n))%mod)*inv)%mod - dfs(1 , n))%mod ; printf("%I64d\n" , (ans+mod)%mod); } return 0 ; }