hdu 4059

来源:互联网 发布:文明6 mac下载 编辑:程序博客网 时间:2024/05/01 07:33
#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <vector>#include <map>#include <set>#include <string>#include <cstring>#include <list>#include <queue>#include <stack>#include <cmath>#include <fstream>using namespace std;#define PF(x) (scanf("%d",&x))#define PT(x,y) (scanf("%d%d",&x,&y))#define PR(x) (printf("%d\n",x))#define PRT(x,y)(printf("%d %d\n",x,y))#define PB(x)(scanf("%I64d",&x))#define PRB(x)(printf("%I64d\n",(x)))typedef __int64 LL;#define N 100005#define M 105#define Mod  1000000007#define Inf 0x7fffffffLL prime[N];int is[N];LL factor[N];int tos;LL ress;LL modpow(LL a,LL n){if(n == 1) return a;if(n==0) return 1;LL res = 1;while(n){if(n&1) res *= a,res %= Mod;a *= a;a %= Mod;n >>= 1;}return res;}LL pow4(LL n){LL res = 1;res = res*n%Mod;res = res*n%Mod;res = res*n%Mod;res = res*n%Mod;return res;}void fact(LL n){tos = 0;LL nn = n;for(int i=0;prime[i] *prime[i]<=n;i++){if(n%prime[i] == 0){factor[tos++] = prime[i];while(nn%prime[i] == 0) nn /= prime[i];}}if(nn>1) factor[tos++] = nn;return ;}void creatprime(){ress =  modpow(30,Mod-2);memset(is,0,sizeof(is));int p = 0;prime[p++]= 2;for(LL i=2;i<N;i+=2) is[i] = 1;for(LL i=3;i<N;i+=2){if(!is[i]){prime[p++] = i;for(LL j = i+i;j<N;j+=i)is[j] = 1;}}}LL sum(LL n){LL res = n;res = res *(n+1)%Mod;res = res *(2*n+1)%Mod;res = res *(n*n%Mod*3%Mod + 3*n%Mod - 1+Mod)%Mod;return res *ress%Mod;}LL dfs(int cur,LL n){LL res = 0;LL tmp;for(int i= cur;i<tos;i++){tmp = factor[i];res = (res + sum(n/tmp)*pow4(tmp)%Mod)%Mod;res = ((res - dfs(i+1,n/tmp)*pow4(tmp)%Mod)%Mod+Mod)%Mod;}return res%Mod;}void init(){creatprime();int test;PF(test);while(test--){LL n;PB(n);if(n == 1) {puts("0");continue;}fact(n);PRB( (sum(n) - dfs(0,n) + Mod)%Mod);}return ;}int main(){init();return 0;}