CDOJ 1805 矩阵 数学

矩阵

题目链接:http://acm.uestc.edu.cn/#/problem/show/1805

Description

小明发现了一种特殊的\(N×M\)的矩阵,矩阵里的元素都是\(1\)\(−1\)。假设\(A_i=第i行(1≤i≤N)所有元素的乘积\)\(B_j=第j列(1≤j≤M)所有元素的乘积\)。喜欢搞事情的小明突发奇想,想知道有多少个不相同的,大小为\(N×M\)的矩阵使得所有\(A_i,B_j\)都是\(K\)的(\(K=1或者−1\))。
当且仅当两个矩阵存在一个元素不相同时两个矩阵不相同。

Input

输入只有一行,三个数字\(N,M,K\)。(\(1≤N≤6,1≤M≤7,K=1或者−1\))

Output

输出一个数字,即满足条件的不同矩阵的数量

Sample Input and Output

Sample InputSample Output
2 2 12

Hint

这两个不同的矩阵分别是
1 1
1 1

-1 -1
-1 -1


题意

http://www.cnblogs.com/scidylanpno/p/7978086.html

题解

(数据量小这题是暴力过去的=-=标准解法参考 http://www.cnblogs.com/scidylanpno/p/7978086.html

#include<bits/stdc++.h>
using namespace std;

const int MAXN = 1<<9;
int N,M,K;
int Keep[10][MAXN];

int XOR(int v)
{
    int ans=1;
    while(v)
    {
        if(v&1) ans=-ans;
        v>>=1;
    }
    return ans;
}

int GetAns(int m,int st)
{
    if(Keep[m][st]!=-1) return Keep[m][st];
    if(m==1)
    {
        if(XOR(st)==K)  return Keep[m][st]=1;
        return Keep[m][st]=0;
    }
    int ans=0,mm=m/2;
    for(int i=0;i<(1<<N);++i)
        ans+=GetAns(mm,i)*GetAns(m-mm,st^i);
    return Keep[m][st]=ans;
}

int main()
{
    memset(Keep,-1,sizeof Keep);
    cin>>N>>M>>K;
    int st;
    if(K==-1)   st=(1<<N)-1;
    else st=0;
    cout<<GetAns(M,st)<<endl;
    return 0;
}

版权所有:scidylanpno
原文链接:http://www.cnblogs.com/scidylanpno/p/7978069.html

转载于:https://www.cnblogs.com/scidylanpno/p/7978069.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值