Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- template<typename T>
- inline void read(T&x){
- T k=1;char gc;x=0;
- while(!isdigit(c)){if(c=='-')k=-1;gc;}
- while(isdigit(c))x=x*10+c-'0',gc;x*=k;
- }
- const int p=1e9+7;
- const int N=1e6+7;
- inline int add(int a,int b){
- return (a+=b)>=p?a-p:a;
- }
- inline ll qpow(ll a,ll b){
- ll ans=1;
- while(b){
- if(b&1)(ans*=a)%=p;
- (a*=a)%=p;
- b>>=1;
- }
- return ans;
- }
- int tot;
- int pri[N];
- int phi[N];
- bool mark[N];
- inline void pre(){
- phi[1]=1;
- for(int i=2;i<N;++i){
- if(!mark[i])pri[++tot]=i,phi[i]=i-1;
- for(int j=1,tmp;j<=tot&&(tmp=i*pri[j])<N;++j){
- mark[tmp]=1;
- if(i%pri[j])phi[tmp]=phi[i]*phi[pri[j]];
- else {
- phi[tmp]=phi[i]*pri[j];
- break;
- }
- }
- }
- }
- map<int,int>mp;
- inline int PHI(int x){
- if(x<N)return phi[x];
- if(mp.count(x))return mp[x];
- int &ret=mp[x];
- ret=x;
- for(ll i=2;i*i<=x;++i){
- if(x%i==0){
- ret=ret/i*(i-1);
- while(x%i==0)x/=i;
- }
- }
- if(x>1)ret=ret/x*(x-1);
- return ret;
- }
- int main(){
- // freopen(".in","r",stdin);
- // freopen(".out","w",stdout);
- int T;r(T);
- pre();
- while(T--){
- int n;r(n);
- int ans=0;
- for(ll i=1;i*i<=n;++i){
- if(n%i)continue;
- int j=n/i;
- ans=add(ans,qpow(n,i-1)*PHI(j)%p);
- if(i==j)continue;
- ans=add(ans,qpow(n,j-1)*PHI(i)%p);
- }
- printf("%d\n",ans);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement