首页 > 其他分享 >Solution - Atcoder YPC2019E Odd Subrectangles

Solution - Atcoder YPC2019E Odd Subrectangles

时间:2024-07-29 21:28:05浏览次数:12  
标签:Atcoder ge int ll Solution 异或 cases Odd operatorname

首先对于 \(0 / 1\) 和为奇数,转化为异或为 \(1\) 来考虑。

考虑如果已经确定了行的选取,又该如何计数。
考虑对于每一列,都处理好在对应行的位置的异或值。
然后记 \(\operatorname{c}_0, \operatorname{c}_1\) 表示列异或值为 \(0 / 1\) 的数量。

知道了 \(\operatorname{c}_0, \operatorname{c}_1\) 之后,就可以直接根据 \(\operatorname{c}_0, \operatorname{c}_1\) 来计数了。
首先对于 \(0\) 来说随便选都行,方案数就为 \(2^{\operatorname{c}_0}\)。
对于 \(1\) 来说就要求选的数量为奇数个,因为当 \(n\ge 1\) 时,\(\sum\limits_{i = 0}^n (-1)^i\binom{n}{i} = 0\),说明当 \(n\ge 1\) 时 \(\sum\limits_{0\le i\le n, i \bmod 2 = 1} \binom{n}{i} = 2^{n - 1}\),于是可以知道这部分的数量为 \(\begin{cases}2^{\operatorname{c_1} - 1} & \operatorname{c_1}\ge 1\\ 0 & \operatorname{c_1} = 0\end{cases}\)。
两部分相乘,就知道最后的方案数为 \(\begin{cases}2^{m - 1} & \operatorname{c_1}\ge 1 \\ 0 & \operatorname{c}_1 = 0\end{cases}\)。

那么就可以去考虑计数选择行的方案数使得每一列对应异或出来都为 \(0\)(\(\operatorname{c}_1 = 0\))。

这部分是好算的。
考虑异或线性基,方案数就为 \(2^{z}\)(\(z\) 为自由元个数)。
证明考虑每个自由元都对应着一种不相同的线性组合方式,不管怎样组合得到的方案都不一样。

可以用 bitset 优化线性基。

时间复杂度 \(\mathcal{O}(\frac{nm^2}{\omega})\)。

#include<bits/stdc++.h>
using ll = long long;
constexpr ll mod = 998244353;
inline ll qpow(ll b, ll a = 2, ll v = 1) {
   while (b) b & 1 && ((v *= a) %= mod), b >>= 1, (a *= a) %= mod;
   return v;
}
const int maxn = 3e2 + 10;
std::bitset<maxn> a, w[maxn];
int main() {
   int n, m; scanf("%d%d", &n, &m);
   ll tot = 1;
   for (int T = 1; T <= n; T++) {
      for (int i = 1, x; i <= m; i++)
         scanf("%d", &x), a.set(i, x);
      int f = 1;
      for (int i = 1; i <= m; i++) {
         if (! a[i]) continue;
         if (! w[i][i]) {
            f = 0, w[i] = a;
            break;
         }
         a ^= w[i];
      }
      if (f)
         (tot <<= 1) %= mod;
   }
   printf("%lld\n", (qpow(n) - tot + mod) * qpow(m - 1) % mod);
   return 0;
}

标签:Atcoder,ge,int,ll,Solution,异或,cases,Odd,operatorname
From: https://www.cnblogs.com/rizynvu/p/18331138

相关文章

  • CF1768D Lucky Permutation Solution
    CF1768D题意不再简述。首先题目要求变成逆序对只有一个的排列,也就是说,我们可以先考虑将一个排列通过交换元素变成另一个排列最小的步数,我们可以将两个排列相同位置上的数连边,很显然会形成几个环,若排列长度为\(n\),形成\(t\)个环,每个环长为\(len_i\),则每个环交换完至少是依次......
  • Solution - Atcoder UTPC2023P Priority Queue 3
    考虑找一些关于合法的\(X\)加入的数的判定条件。假设遇到了一个\(\operatorname{pop}\)操作,令这里删除的数为\(a_i\),显然\(X\)中的数应该要有\(a_i\),其次\(X\)中其他的加入的数要么\(>a_i\)要么是\(a\)中的元素(在前面的\(\operatorname{pop}\)就已经被删了)。于......
  • AtCoder Beginner Contest 362
    AtCoderBeginnerContest362前言vp的时候出了四题,被C题卡了一会,很久才出,D题是dijkstra的板子,改下条件即可,E题是个计数dp,这类题一直不怎么擅长,想起之前杭电第一场那个序列立方的题也是类似这种计数dp,需要加强练习。A-BuyaPen(atcoder.jp)思路判断两两最小。......
  • Solution - Atcoder ABC280Ex Substring Sort
    对于这种子串问题,且有多个基础串,一个比较直观的想法就是先上个广义SAM。考虑SAM与字典序如何联系上。因为跳\(\operatorname{fail}\)相当于是删除子串的一个前缀,直接这样子明显是不行的,因为跳了\(\operatorname{fail}\)字典序没有一个很直观地表示。但是反过来考虑反串,......
  • Solution - Atcoder ARC114F Permutation Division
    令\(a\)为题目中的\(P\)。首先考虑后手的重排策略是什么。因为\(a\)是个排列,元素互不相同,那么肯定就是按照每一段的第一个数的大小,越大的放在越前面。那么当\(a_1\lek\)的时候,显然先手会把以\(1\simk\)开头来划分段。因为否则存在一个开头\(>k\)的段,后手把其放......
  • AtCoder Beginner Contest 363 题解 A-D(待补充)
    A-PilingUp1.1思路其实就是向上取百位的整,需要增加多少,123则为200-123=177;1.2代码voidsolve(){intn;cin>>n;intt=n/100;cout<<(t+1)*100-n;}B-JapaneseCursedDoll 2.1思路就是判断最少需要多少天,会有大于等于P个人......
  • AtCoder Beginner Contest 363
    比赛地址添加链接描述A-PilingUp算法:模拟题目大意在AtCoder竞赛平台中,用户的等级通过正整数分数表示,并根据分数显示相应数量的^符号。分数与^符号显示的规则如下:当分数在1到99(包括99)之间时,显示一个^。当分数在100到199(包括199)之间时,显示两个^。......
  • AtCoder Beginner Contest 364 补题记录(A~F)
    VP五十八分钟苏童流体。好耶A#defineGLIBCXX_DEBUG#include<iostream>#include<cstring>#include<cstdio>#defineintlonglongconstintN=500100;std::strings[N];signedmain(){intn,cnt=1;scanf("%lld",&n);f......
  • AtCoder Beginner Contest 364
    A-GluttonTakahashi(abc364A)题目大意给定\(n\)个字符串,问是否有两个相邻的sweet。解题思路遍历判断当前字符串与上一个字符串是否都为sweet即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_......
  • AtCoder Beginner Contest 364 复盘
    AtCoderBeginnerContest364当你发现你的做法假了时,再看看题目的时限和空限,你就有可能发现,你的做法真了。本场口胡出了\(5\)题的正解,但是只写出了\(3\)题。弱弱又智智。A-GluttonTakahashi&B-GridWalk&C-MinimumGlutton签到D-K-thNearest算口胡出半......