#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<bitset>
#include<ext/pb_ds/priority_queue.hpp>
using namespace std;
const int maxn = 1E6 + 233;
typedef long long LL;
const LL mo = 1000000007;
int T,Inv_2,Inv_6,f[maxn],s[maxn];
map <int,int> M;
int Mul(const LL &x,const LL &y) {return x * y % mo;}
int Add(const int &x,const int &y) {return x + y >= mo ? x + y - mo : x + y;}
int Dec(const int &x,const int &y) {return x - y < 0 ? x - y + mo : x - y;}
int ksm(int x,int y)
{
int ret = 1;
for (; y; y >>= 1)
{
if (y & 1) ret = Mul(ret,x);
x = Mul(x,x);
}
return ret;
}
int calc(int n)
{
int ret;
ret = Mul(n,Mul(n + 1,Mul(2 * n + 1,Inv_6)));
ret = Dec(ret,Mul(3,Mul(1 + n,Mul(n,Inv_2))));
ret = Add(ret,Mul(2,n)); return ret;
}
int Calc(int n)
{
if (n < maxn) return s[n];
if (M.count(n)) return M[n];
int ret = calc(n);
for (int i = 2,last; i <= n; i = last + 1)
{
last = n / (n / i);
ret = Dec(ret,Mul(last - i + 1,Calc(n / i)));
}
return M[n] = ret;
}
int main()
{
#ifdef DMC
freopen("DMC.txt","r",stdin);
#endif
Inv_2 = ksm(2,mo - 2); Inv_6 = ksm(6,mo - 2);
for (int i = 1; i < maxn; i++)
{
f[i] = Add(f[i],Add(Dec(Mul(i,i),Mul(3,i)),2));
for (int j = 2 * i; j < maxn; j += i) f[j] = Dec(f[j],f[i]);
}
for (int i = 1; i < maxn; i++) s[i] = Add(f[i],s[i - 1]);
cin >> T;
while (T--)
{
int n; scanf("%d",&n);
printf("%d\n",Calc(n));
}
return 0;
}
hdu5608 function
最新推荐文章于 2021-03-15 14:12:03 发布