zoukankan      html  css  js  c++  java
  • poj 2409+2154+2888(Burnside定理)

    三道burnside入门题:

    Burnside定理主要理解置换群置换后每种不动点的个数,然后n种不动点的染色数总和/n为answer。

    对于旋转,旋转i个时不动点为gcd(n,i).

    传送门:poj 2409

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <queue>
    #include <cstdlib>
    #define LL long long
    #define N 25
    #define mod 1000000007
    using namespace std;
    LL p[50];
    int gcd(int a,int b)
    {
        return b==0?a:gcd(b,a%b);
    }
    LL power(LL a,LL n)
    {
        LL res=1;
        while(n)
        {
            if(n&1)res*=a;
            a=a*a;
            n>>=1;
        }
        return res;
    }
    int main()
    {
        int n,k;
        while(scanf("%d%d",&k,&n)>0)
        {
            if(n+k==0)break;
            LL ans;
            if(n&1)ans=n*power(k,n/2+1);
            else ans=n/2*(power(k,n/2)+power(k,n/2+1));
            for(int i=1;i<=n;i++)ans+=power(k,gcd(n,i));
            printf("%lld
    ",ans/(2*n));
        }
    }
    View Code

    传送门:poj 2154

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <queue>
    #include <cstdlib>
    #define LL long long
    #define N 35000
    #define mod 1000000007
    using namespace std;
    int n,p;
    int prime[N+10],tot;
    bool vis[N+10];
    void init()
    {
        tot=0;
        memset(vis,false,sizeof(vis));
        for(int i=2;i<=N;i++)
        {
            if(!vis[i])
            {
                prime[tot++]=i;
            }
            for(int j=0;j<tot;j++)
            {
                if(i*prime[j]>N)break;
                vis[i*prime[j]]=true;
            }
        }
    }
    LL power(LL a,LL n)
    {
        LL res=1;
        while(n)
        {
            if(n&1)res=res*a%p;
            a=a*a%p;
            n>>=1;
        }
        return res;
    }
    LL Phi(int x)
    {
        int res=1;
        for(int i=0;prime[i]*prime[i]<=x&&x>1;i++)
        {
            if(x%prime[i]==0)
            {
                res*=prime[i]-1;
                x/=prime[i];
                while(x%prime[i]==0)
                {
                    x/=prime[i];
                    res*=prime[i];
                }
            }
        }
        if(x>1)res*=x-1;
        return res;
    }
    int primefactor[N<<1],sz;
    void factor(int x)
    {
        sz=0;
        for(int i=1;i*i<=x;i++)
        {
            if(x%i==0)
            {
                primefactor[sz++]=i;
                if(i*i!=x)primefactor[sz++]=n/i;
            }
        }
    }
    LL solve(int n)
    {
        factor(n);
        LL ans=0;
        for(int i=0;i<sz;i++)
        {
            ans=(ans+Phi(n/primefactor[i])*power(n,primefactor[i]-1))%p;
        }
        return ans;
    }
    int main()
    {
        int T;init();
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&p);
            printf("%d
    ",solve(n));
        }
    }
    View Code

    传送门:poj 2888

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <queue>
    #include <cstdlib>
    #define LL long long
    #define N 35000
    #define mod 9973
    using namespace std;
    int n,m,k;
    int prime[N+10],tot;
    bool vis[N+10];
    struct matrix
    {
        int m[12][12];
        void zore()
        {
            memset(m,0,sizeof(m));
        }
        void unit()
        {
            for(int i=0;i<12;i++)
                for(int j=0;j<12;j++)
                m[i][j]=i==j;
        }
    }g;
    matrix mult(matrix a,matrix b)
    {
        matrix c;
        c.zore();
        for(int k=0;k<m;k++)
        for(int i=0;i<m;i++)
        {
            if(a.m[i][k]==0)continue;
            for(int j=0;j<m;j++)
                c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
        }
        return c;
    }
    matrix quick_power(matrix a,int n)
    {
        matrix res;
        res.unit();
        while(n>0)
        {
            if(n&1)res=mult(res,a);
            a=mult(a,a);
            n>>=1;
        }
        return res;
    }
    int calc(int n)
    {
        int ans=0;
        matrix res=quick_power(g,n);
        for(int i=0;i<m;i++)
        {
            ans=(ans+res.m[i][i])%mod;
        }
        return ans;
    }
    void init()
    {
        tot=0;
        memset(vis,false,sizeof(vis));
        for(int i=2;i<=N;i++)
        {
            if(!vis[i])
            {
                prime[tot++]=i;
            }
            for(int j=0;j<tot;j++)
            {
                if(i*prime[j]>N)break;
                vis[i*prime[j]]=true;
            }
        }
    }
    LL Phi(int x)
    {
        int res=1;
        for(int i=0;prime[i]*prime[i]<=x&&x>1;i++)
        {
            if(x%prime[i]==0)
            {
                res*=prime[i]-1;
                x/=prime[i];
                while(x%prime[i]==0)
                {
                    x/=prime[i];
                    res*=prime[i];
                }
            }
        }
        if(x>1)res*=x-1;
        return res;
    }
    int primefactor[N<<1],sz;
    void factor(int x)
    {
        sz=0;
        for(int i=1;i*i<=x;i++)
        {
            if(x%i==0)
            {
                primefactor[sz++]=i;
                if(i*i!=x)primefactor[sz++]=n/i;
            }
        }
    }
    int power(int a,int n)
    {
        int res=1;
        a%=mod;
        while(n)
        {
            if(n&1)res=res*a%mod;
            a=a*a%mod;
            n>>=1;
        }
        return res;
    }
    int solve(int n)
    {
        factor(n);
        int ans=0;
        for(int i=0;i<sz;i++)
        {
            ans=(ans+Phi(n/primefactor[i])*calc(primefactor[i]))%mod;
        }
        return ans*power(n,mod-2)%mod;
    }
    int main()
    {
        int T;
        scanf("%d",&T);
        init();
        while(T--)
        {
            scanf("%d%d%d",&n,&m,&k);
            g.zore();
            for(int i=0;i<m;i++)
                for(int j=0;j<m;j++)
                g.m[i][j]=1;
            while(k--)
            {
                int u,v;
                scanf("%d%d",&u,&v);
                u--;v--;
                g.m[u][v]=g.m[v][u]=0;
            }
            printf("%d
    ",solve(n));
        }
    }
    View Code
  • 相关阅读:
    Java+Selenium元素定位的练习(三)
    Java+Selenium元素定位的八种方法(二)
    Java Selenium3 WebDriver启动火狐、Chrome、IE,Edge浏览器的方法(一)
    iOS userAgent
    如何强制视频横竖屏
    一些在开发中不曾注意的小知识,只是怕以后忘了,有迹可查
    多线程与并发
    谈谈那些年要把你弄疯的 bug
    底部导航上拉出现,下拉消失
    新闻详情页顶部的下拉放大与上拉的层叠效果
  • 原文地址:https://www.cnblogs.com/lienus/p/4416107.html
Copyright © 2011-2022 走看看