zoukankan      html  css  js  c++  java
  • bzoj 3503: [Cqoi2014]和谐矩阵【高斯消元】

    如果确定了第一行,那么可以推出来整个矩阵,矩阵合法的条件是n+1行全是0
    所以推出来n+1行和1行的关系,然后用异或高斯消元来解即可

    #include<iostream>
    #include<cstdio>
    using namespace std;
    const int N=45;
    int n,m,f[N][N][N],a[N][N],ans[N][N];
    void gaosi()
    {
        for(int i=1;i<=m;i++)
    	{
    		int nw=i;
    		while(!a[nw][i]&&nw<=m)
    			nw++;
            if(nw>m)
    			continue;
            if(nw!=i)
    			for(int k=1;k<=m;k++)
    				swap(a[nw][k],a[i][k]);
            for(int j=1;j<=m;j++)
    			if(j!=i&&a[j][i])
    				for(int k=1;k<=m;k++)
    					a[j][k]^=a[i][k];
        }
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
    		f[1][i][i]=1;
        for(int i=2;i<=n+1;i++)
            for(int j=1;j<=m;j++)
                for(int k=1;k<=m;k++)
    				f[i][j][k]=f[i-1][j-1][k]^f[i-1][j][k]^f[i-1][j+1][k]^f[i-2][j][k];
    	for(int i=1;i<=m;i++)
    		for(int j=1;j<=m;j++)
    			a[i][j]=f[n+1][i][j];
        gaosi();
        for(int i=m;i>=1;i--)
    	{
            if(!a[i][i])
    			ans[1][i]=1;
    		else
                for(int j=i+1;j<=m;j++)
    				if(a[i][j])
    					ans[1][i]^=ans[1][j];
    	}
        for(int i=2;i<=n;i++)
            for(int j=1;j<=m;j++)
    			ans[i][j]=ans[i-1][j]^ans[i-1][j-1]^ans[i-1][j+1]^ans[i-2][j];
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=m;j++)
    			printf("%d ",ans[i][j]);
    		puts("");
    	}
        return 0;
    }
    
  • 相关阅读:
    Network (poj1144)
    C. Hongcow Builds A Nation
    ZYB loves Xor I(hud5269)
    D. Chloe and pleasant prizes
    Game(hdu5218)
    约瑟夫环的递推方法
    Misaki's Kiss again(hdu5175)
    Exploration(hdu5222)
    B. Arpa's weak amphitheater and Mehrdad's valuable Hoses
    C. Arpa's loud Owf and Mehrdad's evil plan
  • 原文地址:https://www.cnblogs.com/lokiii/p/9635730.html
Copyright © 2011-2022 走看看