201512-5 矩阵

只会暴力,答案没看懂,呜呜呜。乘的时候还乱七八糟的。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#include <bitset>
#define ls  (u<<1)
#define rs  (u<<1|1)
#define mid (l+r>>1)
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N = 1000, mod = 1e9 + 7;

bitset<N> a[31][N], b;
void inverse(bitset<N> &a);
void prin(bitset<N> a[]);

int n, m;

void mull(bitset<N> a[], bitset<N> b[])
{
	bitset<N> c[N];
	for(int i = 0;i < m;i ++)for(int j = 0;j < m;j ++)c[i][j] = b[m-1-j][i];
//	prin(b);prin(c);cout<<" --- ";
	for(int i = 0;i < m;i ++)
		for(int j = 0;j < m;j ++)
			a[i][j] = (b[i]&c[j]).count()&1;	
}
void mull(bitset<N> &a, bitset<N> b[])
{
	bitset<N> c;
	for(int i = 0;i < m;i ++) c[m-1-i] = (b[i]&a).count()&1;
	a = c;
}

int main() 
{
	scanf("%d", &m);
	string c;
	for(int i = 0;i < m;i ++) inverse(a[0][i]); inverse(b);
	for(int i = 1;i < 31;i ++) mull(a[i], a[i-1]);
	scanf("%d", &n);
	while(n --)
	{
		int k, f = 0;
		bitset<N> ans = b;
		scanf("%d", &k);
		while(k)
		{
			if(k&1)mull(ans, a[f]);
			f++; k >>= 1;
		}
		for(int i = m-1;i >= 0;i --)cout<<ans[i];cout<<endl;
	}

	return 0;
}


void inverse(bitset<N> &a){string c;cin>>c;for(int i = 0;i < c.size();i ++)a[i] = c[c.size()-1-i]-'0';}
void prin(bitset<N> a[]){puts("");for(int i = 0;i < m;i ++)cout<<a[i]<<endl;puts("");}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李昌荣。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值