P5159 WD与矩阵

博客围绕奇怪的结论题展开,采用增量构造法,指出题目要求每行每列有偶数个1时,最后一列一行可调整前面n - 1阶矩阵的值,答案是2 ^ ((n - 1)(m - 1))。还介绍了证明过程,假设每行是二进制数,最后一行是前面的异或和,且长度为m的二进制数有偶数个二进制位的有2 ^ (m - 1)个。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路

奇怪的结论题
考虑增量构造,题目要求每行每列都有偶数个1,奇偶性只需要增减1就能够调整了,所以最后一列一行一定能调整前面n-1阶矩阵的值,所以前面可以任选
答案是\(2^{(n-1)(m-1)}\)

当时怎么也考虑不清楚最后一行和最后一列交点的值,但是莽了一发发现对了。。
看了shadowice1984的题解之后才学会了证明
假设每行填的都是一个二进制数,最后一行填的必然是前面的异或和
因为每行的数都有偶数个二进制位,对于异或,有\(bitcount(a\oplus b)=bitcount(a)+bitcount(b)-2\times bitcount(a \& b)\)
所以最后一行必然有偶数个二进制位,必然合法
另外,长度为m的二进制数有偶数个二进制位的恰好有\(2^{m-1}\)

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;
const int MOD = 998244353;
int n,m;
int pow(int a,int b){
    int ans=1;
    while(b){
        if(b&1)
            ans=(ans*a)%MOD;
        a=(a*a)%MOD;
        b>>=1;
    }
    return ans;
}
signed main(){
    int T;
    scanf("%lld",&T);
    while(T--){
        scanf("%lld %lld",&n,&m);
        printf("%lld\n",pow(2,(n-1)*(m-1)));
    }
    return 0;
}

转载于:https://www.cnblogs.com/dreagonm/p/10550269.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值