zoukankan      html  css  js  c++  java
  • luogu P1446 [HNOI2008]Cards burnside引理 置换 不动点

    LINK:Cards

    不太会burnside引理 而这道题则是一个应用。

    首先 一个非常舒服的地方是这道题给出了m个本质不同的置换 然后带上单位置换就是m+1个置换.

    burnside引理:

    avatar

    其中D(a_j)表示 在(a_j)这置换中的不动点的个数.

    其实我们求出每个置换的不动点个数就行了.

    循环很好求 每个循环都填一样的就是不动点了 直接dp一下即可.

    code
    //#include<bits/stdc++.h>
    #include<iostream>
    #include<cstdio>
    #include<ctime>
    #include<cctype>
    #include<queue>
    #include<deque>
    #include<stack>
    #include<iostream>
    #include<iomanip>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<ctime>
    #include<cmath>
    #include<cctype>
    #include<cstdlib>
    #include<queue>
    #include<deque>
    #include<stack>
    #include<vector>
    #include<algorithm>
    #include<utility>
    #include<bitset>
    #include<set>
    #include<map>
    #define ll long long
    #define db double
    #define INF 1000000001
    #define ldb long double
    #define pb push_back
    #define put_(x) printf("%d ",x);
    #define get(x) x=read()
    #define gt(x) scanf("%d",&x)
    #define gi(x) scanf("%lf",&x)
    #define put(x) printf("%d
    ",x)
    #define putl(x) printf("%lld
    ",x)
    #define rep(p,n,i) for(RE int i=p;i<=n;++i)
    #define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
    #define fep(n,p,i) for(RE int i=n;i>=p;--i)
    #define vep(p,n,i) for(RE int i=p;i<n;++i)
    #define pii pair<int,int>
    #define mk make_pair
    #define RE register
    #define P 1000000007ll
    #define gf(x) scanf("%lf",&x)
    #define pf(x) ((x)*(x))
    #define uint unsigned long long
    #define ui unsigned
    #define EPS 1e-4
    #define sq sqrt
    #define S second
    #define F first
    using namespace std;
    char *fs,*ft,buf[1<<15];
    inline char gc()
    {
    	return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
    }
    inline int read()
    {
    	RE int x=0,f=1;RE char ch=gc();
    	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
    	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=gc();}
    	return x*f;
    
    }
    const int MAXN=66;
    int n,m,mod;
    int r,b,g,ans;
    int vis[MAXN];
    int c[MAXN];
    int f[21][21][21],mark[MAXN];
    inline int ksm(int b,int p)
    {
    	int cnt=1;
    	while(p)
    	{
    		if(p&1)cnt=(ll)cnt*b%mod;
    		b=(ll)b*b%mod;p=p>>1;
    	}
    	return cnt;
    }
    inline int calc()
    {
    	memset(f,0,sizeof(f));
    	memset(mark,0,sizeof(mark));
    	f[0][0][0]=1;int ww=0;
    	rep(1,n,i)
    	{
    		if(!mark[i])
    		{
    			int cnt=1;
    			mark[i]=1;
    			int j=i;
    			while(!mark[vis[j]])
    			{
    				j=vis[j];
    				mark[j]=1;++cnt;
    			}
    			c[++ww]=cnt;
    		}
    	}
    	rep(1,ww,T)
    	{
    		fep(r,0,i)fep(g,0,j)fep(b,0,k)
    		{
    			if(i>=c[T])f[i][j][k]=(f[i][j][k]+f[i-c[T]][j][k])%mod;
    			if(j>=c[T])f[i][j][k]=(f[i][j][k]+f[i][j-c[T]][k])%mod;
    			if(k>=c[T])f[i][j][k]=(f[i][j][k]+f[i][j][k-c[T]])%mod;
    		}
    	}
    	return f[r][g][b];
    }
    int main()
    {
    	//freopen("1.in","r",stdin);
    	get(r);get(b);get(g);
    	get(m);n=r+b+g;get(mod);
    	rep(1,m,i)
    	{
    		rep(1,n,j)get(vis[j]);
    		ans=(ans+calc())%mod;
    	}
    	rep(1,n,j)vis[j]=j;
    	ans=(ans+calc())%mod;
    	ans=(ll)ans*ksm(m+1,mod-2)%mod;
    	put(ans);return 0;
    }
    
  • 相关阅读:
    Nginx使用GeoIP模块来限制地区访问
    CenTOS7使用ACL控制目录权限,只给某个用户访问特定目录
    CentOS配置服务开机自启
    设置普通用户输入sudo,免密进入root账户
    Centos安装git并配置ssh
    ThreadLocal线程隔离
    Spring cloud 超时配置总结
    Hystrix超时测试
    mysql limit分页查询效率比拼
    linux CPU100%异常排查
  • 原文地址:https://www.cnblogs.com/chdy/p/13352954.html
Copyright © 2011-2022 走看看