zoukankan      html  css  js  c++  java
  • 【BZOJ4000】[TJOI2015]棋盘(矩阵快速幂,动态规划)

    【BZOJ4000】[TJOI2015]棋盘(矩阵快速幂,动态规划)

    题面

    BZOJ
    洛谷

    题解

    发现所有的东西都是从(0)开始编号的,所以状压只需要压一行就行了。
    然后就可以随意矩乘了。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    #define uint unsigned int
    inline int read()
    {
    	int x=0;bool t=false;char ch=getchar();
    	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    	if(ch=='-')t=true,ch=getchar();
    	while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    	return t?-x:x;
    }
    int n,m,P,k,N;
    struct Matrix
    {
    	uint s[64][64];
    	void clear(){memset(s,0,sizeof(s));}
    	void init(){clear();for(int i=0;i<N;++i)s[i][i]=1;}
    	uint*operator[](int x){return s[x];}
    }T;
    Matrix operator*(Matrix a,Matrix b)
    {
    	Matrix c;c.clear();
    	for(int i=0;i<N;++i)
    		for(int j=0;j<N;++j)
    			for(int k=0;k<N;++k)
    				c[i][j]+=a[i][k]*b[k][j];
    	return c;
    }
    Matrix fpow(Matrix a,int b)
    {
    	Matrix s;s.init();
    	while(b){if(b&1)s=s*a;a=a*a;b>>=1;}
    	return s;
    }
    int lim[3],forbid[3][64],zt[64];
    int main()
    {
    	n=read();m=read();P=read();k=read();
    	for(int i=0;i<3;++i)
    		for(int j=0;j<P;++j)lim[i]|=read()<<j;
    	lim[1]^=1<<k;N=1<<m;
    	for(int i=0;i<N;++i)
    		for(int j=0;j<m;++j)
    			if(i&(1<<j))
    			{
    				forbid[0][i]|=(j<k)?lim[0]>>(k-j):lim[0]<<(j-k);
    				forbid[1][i]|=(j<k)?lim[1]>>(k-j):lim[1]<<(j-k);
    				forbid[2][i]|=(j<k)?lim[2]>>(k-j):lim[2]<<(j-k);
    			}
    	int tmp=0;
    	for(int i=0;i<N;++i)
    		if(!(i&forbid[1][i]))zt[tmp++]=i;
    	N=tmp;
    	for(int i=0;i<N;++i)
    		for(int j=0;j<N;++j)
    			if(((forbid[2][zt[i]]&zt[j])==0)&&((forbid[0][zt[j]]&zt[i])==0))
    				++T[i][j];
    	T=fpow(T,n);
    	uint ans=0;
    	for(int i=0;i<N;++i)ans+=T[0][i];
    	printf("%u
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    动态规划最大利润的问题
    【转】mysql基础汇总
    mac使用frida
    Mac 下python3 [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed 解决方法
    mac使用jadx逆向app
    python桶排序代码
    requests_html使用asyncio
    async for的使用
    [转载]微信企业号:企业客户的移动应用入口
    微信服务号、订阅号、企业号差别
  • 原文地址:https://www.cnblogs.com/cjyyb/p/10764481.html
Copyright © 2011-2022 走看看