首页 > 其他分享 >The 2nd Universal Cup. Stage 5: Northern J Sets May Be Good

The 2nd Universal Cup. Stage 5: Northern J Sets May Be Good

时间:2023-10-18 22:24:46浏览次数:40  
标签:Good Northern Cup read sum ne pos land equiv

题解

我们考虑计算 \(\sum_{S\subseteq\{1,2,3,\cdots,n\}} (-1)^{cnt(S)}\),这里 \(cnt(S)\) 表示 \(S\) 集合的导出子图的边数。

我们记 \(x_i=[i\in S]\)。

我们考虑删掉 \(n\) 号点。

注意到如果 \(x_i\) 的取值会影响 \(cnt(s)\) 的奇偶性,则正负相消,贡献为 \(0\)。

所以我们需要保证下列条件满足:

\[\sum_{i=1}^{n-1}a_{n,i} x_i + a_{n,n}\equiv 0\pmod 2 \]

我们考虑是否存在位置 \(pos\),满足 \(a_{n,pos}(pos\ne n) =1\)。

  1. 如果不存在这样的 \(pos\),那我们根据 \(a_{n,n}\) 的取值分类讨论:

    1. \(a_{n,n}=0\),则贡献乘 \(2\);
    2. \(a_{n,n}=1\),贡献变成 \(0\)。
  2. 如果存在一个位置 \(pos\),满足 \(a_{n,pos}=1\)。

    那么,根据 \(\sum_{i=1}^{n-1}a_{n,i} x_i + a_{n,n}\equiv 0\pmod 2\),我们可以得出:

\[ x_{pos}\equiv \sum_{i=1\land i \ne pos}^{n-1} a_{n,i} x_i + a_{n,n} \pmod 2 \]

​ 我们考虑对于一个序列 \(x_1,x_2,\cdots,x_n\) 计算答案。

\[\begin{aligned} &\sum_{i=1}^{n}\sum_{j=i+1}^n a_{i,j} x_i x_j\\ \equiv&\sum_{i=1}^{n-1}\sum_{j=i+1}^{n-1} a_{i,j} x_i x_j\\ \equiv&\sum_{i=1\land i \ne pos}^{n - 1}\sum_{j=i+1\land j\ne pos}^{n - 1} a_{i,j} x_ix_j+\sum_{i=1\land i \ne pos}^{n-1} a_{i,pos} x_ix_{pos} + a_{pos,pos}x_{pos}\\ \equiv&\sum_{i=1\land i \ne pos}^{n - 1}\sum_{j=i+1\land j\ne pos}^{n - 1} a_{i,j} x_i x_j+\sum_{i=1\land i \ne pos}^{n-1} a_{i,pos} x_i(\sum_{i=1\land i \ne pos}^{n-1} a_{n,i} x_i+a_{n,n})+a_{pos,pos}(\sum_{i=1\land i \ne pos}^{n-1} a_{n,i} x_i+a_{n,n}) \end{aligned} \]

​ 于是,我们就可以把 \(n\times n\) 的矩阵,在 \(O(\frac{n^2}{w})\) 的时间内,变成 \((n-2)\times (n-2)\) 的矩阵。

​ 注意到 \(x_n\) 有两种取值,所以贡献要 \(\times 2\)。注意到上述式子继续展开,则 \(a_{pos,pos}a_{n,n}\) 的项,所以贡献可能 \(\times (-1)\)。

总时间复杂度 \(O(\frac{n^3}{w})\)。

代码

// MagicDark
#include <bits/stdc++.h>
#define debug cerr << "[" << __LINE__ << "] "
#define SZ(x) (int) x.size() - 1
#define all(x) x.begin(), x.end()
#define ms(x, y) memset(x, y, sizeof x)
#define F(i, x, y) for (int i = (x); i <= (y); i++)
#define DF(i, x, y) for (int i = (x); i >= (y); i--)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
template <typename T> inline void chkmax(T& x, T y) { x = max(x, y); }
template <typename T> inline void chkmin(T& x, T y) { x = min(x, y); }
template <typename T> inline void read(T &x) {
	x = 0; int f = 1; char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
	for (; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
	x *= f;
}
const int N = 1010, MOD = 998244353, inv2 = (MOD + 1) >> 1;
int n, m, ans = 1, t = 1;
bitset <N> a[N];
signed main() {
	read(n), read(m);
	F(i, 1, n) t = 2 * t % MOD;
	F(i, 1, m) {
		int x, y; read(x), read(y);
		a[x][y] = a[y][x] = true;
	}
	DF(i, n, 1) {
		bool flag = false;
		F(j, 1, i - 1) flag |= a[i][j];
		if (flag) {
			int pos = -1;
			F(j, 1, i - 1)
				if (a[j][i]) {
					pos = j;
					break;
				}
			assert(~pos);
			a[i][pos] = false;
			F(j, 1, i - 1) if (j != pos && a[pos][j]) {
				a[j] ^= a[i];
				if (a[i][i] ^ a[i][j]) a[j][j].flip();
			}
			F(j, 1, i - 1) if (j != pos && a[i][j]) {
				a[j] ^= a[pos];
			}
			if (a[pos][pos]) {
				F(j, 1, i - 1)
					if (j != pos && a[i][j]) a[j][j].flip();
				if (a[i][i]) ans = (ll) ans * (MOD - 1) % MOD;
			}
			F(j, 1, i - 2) {
				if (j >= pos) a[j] = a[j + 1];
				bitset <N> s = (a[j] >> pos);
				a[j] = a[j] ^ (s << pos) ^ ((s >> 1) << pos);
			}
			i--;
			ans = (ll) ans * 2 % MOD;
		} else if (!a[i][i]) ans = (ll) ans * 2 % MOD;
			else ans = 0;
	}
	cout << (ll) (t + ans) * inv2 % MOD;
	return 0;
}
/* why?
*/

标签:Good,Northern,Cup,read,sum,ne,pos,land,equiv
From: https://www.cnblogs.com/zhaohaikun/p/17773493.html

相关文章

  • ucup 题目乱炖
    Season2022#6299.BinaryString如果\(0\)的个数小于\(1\)的个数那么就反转\(01\)以及反转序列,接下来假设\(0\)的个数大于等于\(1\)的个数。称有\(11\)的序列为”未完全展开的“,那么序列的种类数有两个阶段:展开过程中和展开之后的。在展开之后如果知道序列那么用......
  • [ARC167D] Good Permutation 题解
    题意对于一个长度为\(N\)的排列\(Q\),定义其为好的,当且仅当对于任意整数\(i\in\left[1,N\right]\),在进行若干次操作\(i\leftarrowQ_i\)后可以得到\(i=1\)。给定一个排列\(P\),定义一次操作为交换两个数。定义\(M\)为可以将\(P\)变为一个好的的排列的最小操......
  • ARC167D Good Permutation 题解
    题意给定一个长度为\(N\)的排列\((P_1,P_2,\cdots,P_N)\)。称一个排列\(P\)为“好排列”当且仅当对于所有\(1\leqx\leqN\),都能通过不停地使\(x\leftarrowP_x\)将\(x\)变成\(1\)。通过最小次数操作将\(P\)变成“好排列”,每次操作为交换\(P\)中的两个数\(P_i\)......
  • 【转载】关于使用CUPS共享打印机的正确姿势,你可以永远告别打印驱动了
    原文:https://www.right.com.cn/forum/thread-8276397-1-1.html 发表于2023-2-1715:42|只看该作者|只看大图本帖最后由kero990于2023-2-1715:48编辑一直以来,使用CUPS作为打印服务器是论坛里流行的做法,一方面这是windows的传统弱项,另一方面也是移动打印......
  • CF264B Good Sequences 题解
    GoodSequences状态很显然,设\(f[i]\)表示位置\(i\)的最长长度。关键是转移,暴力转移是\(O(n^2)\)的,我们必须找到一个更优秀的转移。因为一个数的质因子数量是\(O(\logn)\)的,而只有和这个数具有相同质因子的数是可以转移的;因此我们可以对于每个质数\(p\),设一个\(mx_p......
  • 在Ubuntu上用cups api实现打印功能
    https://blog.csdn.net/weixin_48885322/article/details/127270545在Ubuntu上用cupsapi实现打印功能银离子_kg已于2022-10-1310:00:47修改1768收藏5文章标签:ubuntulinuxbash版权​最近由于工作需要,要写一套打印相关的接口。Linux上一般自带一套管理打印机的通......
  • The 2nd Universal Cup. Stage 4: Taipei - I(状压DP)
    目录I.IntervalAdditionI.IntervalAddition题意给定一个长度为n$(1\len\le23)$的数组a。你可以进行一种操作:选择区间\([l,r]\)并给这个区间所有的数都加上一个任意的数。问你使得整个数组均为0所需的最小操作次数?思路考虑差分数组无论怎么对于区间\([l,r......
  • CF1856B Good Arrays
    题意简述:给定一个序列\(a\),我们定义一个序列\(b\)是好的当且仅当对于\(1\dotsn\)内的每一个\(i\),\(a_i\neqb_i\)且\(\sum_{i=1}^na_i=\sum_{i=1}^nb_i\)(\(a_i\),\(b_i\)均为正整数)。现在有\(T\)组数据,每组数据给定\(n\)和序列\(a\),判断是否存在一个合法的序......
  • 代码源:a-good string(CF1385D,分支)
    传送点击查看代码#include<bits/stdc++.h>usingnamespacestd;chars[131080];int_solve(intL,intR,charx){ if(L==R)returns[L]!=x; intM=L+(R-L)/2; intt1=0,t2=0; for(inti=L;i<=M;++i)if(s[i]!=x)t1++; for(inti=M+1;i<=R;++i)if(s[i]!=x)......
  • The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online (The 2nd Universal Cup
    The2018ACM-ICPCAsiaQingdaoRegionalContest,Online(The2ndUniversalCup.Stage1:Qingdao)J-PresstheButton\(1\leqa,b,c,d\leq10^6\)题解容易发现存在循环节,每次位于\(gcd(a,c)\)的倍数的位置所以我们考虑处理一个循环节内的情况如果\(v\le......