P4980 【模板】Pólya 定理

【题意】

【分析】

 

 

【代码】

#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define fi first
#define se second
#define lson now<<1
#define rson now<<1|1
typedef long long ll;
const int mod=1e9+7;
int qpow(int a,int b)
{
    int res=1;
    while(b)
    {
        if(b&1) res=1LL*res*a%mod;
        a=1LL*a*a%mod;
        b>>=1;
    }
    return res;
}
int n;
int phi(int x)
{
    int ans=x;
    for(int i=2;i<=(int)sqrt(x);i++)
    {
        if(x%i) continue;
        ans=ans-ans/i;
        while(x%i==0) x/=i;
    }
    if(x!=1) ans=ans-ans/x;
    return ans;
}
int main()
{
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    int T; scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        int cnt=sqrt(n);
        int ans=0;
        for(int i=1;i<=cnt;i++)
        {
            if(n%i) continue;
            int p1=phi(i),f1=qpow(n,n/i);
            f1=1LL*f1*p1%mod;
            ans=(ans+f1)%mod;
            if(i*i!=n)
            {
                int p2=phi(n/i),f2=qpow(n,i);
                f2=1LL*f2*p2%mod;
                ans=(ans+f2)%mod;
            }
        }
        printf("%d\n",1LL*qpow(n,mod-2)*ans%mod);
    }
    return 0;
}

 

posted @ 2021-06-02 19:15  andyc_03  阅读(35)  评论(0编辑  收藏  举报