zoukankan      html  css  js  c++  java
  • P4980 【模板】Polya定理

    传送门

    根据(Polya)定理,设每个置换的循环节个数为(k_i),颜色总数为(m),置换群的大小为(|G|),那么染色的方案数为$$Ans=frac{sum_{i=1}^{|G|}m^{k_i}}{|G|}$$

    然后这题里面置换群分别为转一格,转两格,...,转(n)格,则转(i)格的置换的循环节大小为(gcd(i,n)),那么答案就可以表示为$$Ans=frac{sum_{i=1}^{n}n^{gcd(n,i)}}{n}$$
    时间复杂度(O(nlogn))非常优秀

    那么只好推柿子推柿子$$Ans=frac{sum_{i=1}^{n}n^{gcd(n,i)}}{n}$$

    [Ans=frac{sum_{d=1}^n n^d sum_{i=1}^n [gcd(i,n)==d]}{n} ]

    [Ans=frac{sum_{d|n} n^d sum_{i=1}^{leftlfloorfrac{n}{d} ight floor} [gcd(i,{leftlfloorfrac{n}{d} ight floor} )==d]}{1} ]

    [Ans=frac{sum_{d|n} n^d varphi(leftlfloorfrac{n}{d} ight floor)}{1} ]

    然后因为(n)特别大,所以建议在线求(varphi)

    然后复杂度就达到(O()能过())

    //minamoto
    #include<bits/stdc++.h>
    #define R register
    #define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
    #define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
    #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
    using namespace std;
    char buf[1<<21],*p1=buf,*p2=buf;
    inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
    int read(){
        R int res,f=1;R char ch;
        while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
        for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
        return res*f;
    }
    void print(int x){if(x>9)print(x/10);putchar(x%10+48);}
    const int N=1e5,P=1e9+7;
    inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
    inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
    int ksm(R int x,R int y){
        R int res=1;
        for(;y;y>>=1,x=1ll*x*x%P)if(y&1)res=1ll*res*x%P;
        return res;
    }
    int p[N+5],vis[N+5],phi[N+5],m,n,inv[N+5];
    void init(){
        phi[1]=1;fp(i,2,N){
            if(!vis[i])p[++m]=i,phi[i]=i-1;
            for(R int j=1;j<=m&&1ll*i*p[j]<=N;++j){
                vis[i*p[j]]=1;
                if(i%p[j]==0){phi[i*p[j]]=phi[i]*p[j];break;}
                phi[i*p[j]]=phi[i]*(p[j]-1);
            }
        }
        inv[0]=inv[1]=1;fp(i,2,N)inv[i]=((-1ll*P/i*inv[P%i])%P+P)%P;
    }
    int PHI(int n){
        R int res=n;
        for(R int i=1;1ll*p[i]*p[i]<=n;++i)if(n%p[i]==0){
            res=res-res/p[i];
            while(n%p[i]==0)n/=p[i];
        }if(n!=1)res=res-res/n;
        return res;
    }
    inline int Phi(R int n){return n<=N?phi[n]:PHI(n);}
    inline int Inv(R int n){return n<=N?inv[n]:ksm(n,P-2);}
    void solve(){
        n=read();R int res=0;
        for(R int i=1;i*i<=n;++i)if(n%i==0){
            res=add(res,1ll*Phi(i)*ksm(n,n/i)%P);
            if(i*i!=n)res=add(res,1ll*Phi(n/i)*ksm(n,i)%P);
        }print(1ll*res*Inv(n)%P),putchar('
    ');
    }
    int main(){
    //	freopen("testdata.in","r",stdin);
        init();
        int T=read();
        while(T--)solve();
        return 0;
    }
    
  • 相关阅读:
    etcd:从应用场景到实现原理的全方位解读
    open-falcon编写的整个脑洞历程
    开源还是商用?十大云运维监控工具横评
    我的后端开发书架2015 2.0版
    【MDCC 2015】友盟数据平台负责人吴磊:移动大数据平台的架构与实践
    Effective Go
    Airbnb JavaScript Style Guide
    Google HTML/CSS Style Guide
    nservicebus教程-目录
    测试
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/10152260.html
Copyright © 2011-2022 走看看