首页 > 其他分享 >CodeForces 1906K Deck-Building Game

CodeForces 1906K Deck-Building Game

时间:2023-12-25 18:45:12浏览次数:45  
标签:Building typedef text ll long Game FWT 1906K define

洛谷传送门

CF 传送门

UNR #2 黎明前的巧克力

枚举两个人选的卡的并集 \(S\),那么当 \(\bigoplus\limits_{i \in S} a_i = 0\) 时 \(S\) 有贡献 \(2^{|S|}\)。

考虑将 \(2^{|S|}\) 分摊到每个元素上,也就是每个元素有 \(2\) 的贡献,然后把这些贡献乘起来。所以题目其实是想让我们算这个东西:\([x^0] \prod\limits_{i = 1}^n (1 + 2x^{a_i})\),定义 \(x^i \times x^j = x^{i \oplus j}\)。

令 \(F_i(x) = 1 + 2x^{a_i}\),考虑给每个 \(F_i\) FWT 一下,对位乘后再逆 FWT 回去。因此我们已经有了一个 \(O(nV)\) 的做法,显然不能通过。

考虑 \(F_i\) FWT 后的结果,因为此处 \(\text{FWT}(a)_i = \sum\limits_{j} (-1)^{\text{popcount}(i \& j)} a_j\),容易发现 \(\text{FWT}(F_i)\) 只含有 \(1\) 或 \(-3\)。因此我们对位乘后第 \(i\) 位的结果可以表示成 \((-1)^{x_i} 3^{n - x_i}\)。

令 \(G = \text{FWT}(F_1) + \text{FWT}(F_2) + \cdots + \text{FWT}(F_n)\),那么我们有 \(-x_i + 3(n - x_i) = G_i\)。解得 \(x_i = \frac{3n - G_i}{4}\)。又因为 FWT 的线性性我们有 \(G = \text{FWT}(F_1 + F_2 + \cdots F_n)\),所以 \(G_i\) 和 \(x_i\) 都能快速求出来。所以我们求出这样对位乘后第 \(i\) 位的结果,最后再逆 FWT 回去即可得到 \([x^0] \prod\limits_{i = 1}^n F_i\)。

总时间复杂度 \(O(n \log V)\)。

code
// Problem: K. Deck-Building Game
// Contest: Codeforces - 2023-2024 ICPC, Asia Jakarta Regional Contest (Online Mirror, Unrated, ICPC Rules, Teams Preferred)
// URL: https://codeforces.com/problemset/problem/1906/K
// Memory Limit: 1024 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 131100;
const int N = 131072;
const ll mod = 998244353;
const ll inv2 = (mod + 1) / 2;

inline ll qpow(ll b, ll p) {
	ll res = 1;
	while (p) {
		if (p & 1) {
			res = res * b % mod;
		}
		b = b * b % mod;
		p >>= 1;
	}
	return res;
}

ll n, a[maxn];

inline void FWT(ll *a, ll o) {
	for (int k = 1; k < N; k <<= 1) {
		for (int i = 0; i < N; i += (k << 1)) {
			for (int j = 0; j < k; ++j) {
				ll x = a[i + j], y = a[i + j + k];
				a[i + j] = (x + y) * o % mod;
				a[i + j + k] = (x - y + mod) * o % mod;
			}
		}
	}
}

void solve() {
	scanf("%lld", &n);
	for (int i = 0, x; i < n; ++i) {
		scanf("%d", &x);
		a[x] += 2;
	}
	a[0] += n;
	FWT(a, 1);
	ll inv4 = qpow(4, mod - 2);
	for (int i = 0; i < N; ++i) {
		ll x = (n * 3 - a[i] + mod) * inv4 % mod;
		a[i] = ((x & 1) ? mod - 1 : 1) * qpow(3, n - x) % mod;
	}
	FWT(a, inv2);
	printf("%lld\n", a[0]);
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:Building,typedef,text,ll,long,Game,FWT,1906K,define
From: https://www.cnblogs.com/zltzlt-blog/p/17926757.html

相关文章

  • Atcoder ABC 333 F - Bomb Game 2
    题目大意(采用0#语言):有n个人,每个人每次要么被“炸掉”,要么就被移到最后面去,概率都是1/2,求最后只剩下初始时排名为第i的人的概率。 这道题跟人数有关,而且跟位置有关。我们定义dp[i]表示一共有i个人,第i个为最后一位留下来时的概率。(不想写公式)定义j从0到i-1,表示从前面i-1......
  • B. Collecting Game
    原题链接简单概括把每个i看成一只怪兽,每只怪兽的初始能量值是\(a[i]\),怪兽可以吃掉其他比自己能量值小的怪兽,并得到进化,能量值增加,增加的大小等于被吃的怪兽的能量值。问每只怪兽最多能吃几只怪兽?事实1.无论如何,一只怪兽一定能吃掉所有初始值比他小的怪兽。2.在吃完所有初......
  • 浅谈 Nim game(尼姆博弈)
    首先,我们需要了解\(Nim\)游戏是什么东西。\(Nim\)游戏指:两个人,有\(n\)堆数,每堆有\(a_i\)个,每次可以且仅可以取一堆中的若干个数,求问先手有没有必胜策略(当然两个人都足够聪明)。首先,先研究显然的必胜策略。比如,我们要得到\(0\)这个数,那么当你取完时还剩下\(0\)个。然......
  • Codeforces Round 651 (Div. 2)C. Number Game(数学思维数论)
    C.NumberGame我们考虑那些状态是必胜态我的回合时n为奇数(除1外),直接除以n则必胜下面偶数的情况稍复杂偶数我们能进行的操作只有除以一个奇数,需要考虑怎么把当前状态变为对手的必败态偶数一定含2的因子,\(n=2^k*q,q为奇数\)当\(k=1时如果q\)是一个质数那么只能除一次q这样......
  • configure: error: Building GCC requires GMP 4.2+, MPFR 3.1.0+ and MPC 0.8.0+.
    gitclone git://gcc.gnu.org/git/gcc.gitgcc-CXX17gitcheckoutorigin/release/gcc-12./configureconfigure:error:BuildingGCCrequiresGMP4.2+,MPFR3.1.0+andMPC0.8.0+.Trythe--with-gmp,--with-mpfrand/or--with-mpcoptionstospecifytheirlocation......
  • E2. Game with Marbles (Hard Version)
    原题链接导论,有点博弈论的感觉?每个人轮流选一个大家都有的球,然后自己扣一个球,对方扣完。问女生剩下的球减去男生剩下的球,最大值是多少?一些条件1.初始每个人每种球都有2.女生想使答案值大一点,男生想使答案值小一点,换句话说,女生想使\(A\)值大一点,男生想使\(B\)值大一点,每个人都......
  • C. Game with Multiset
    原题链接反思:要把各种可能的情况都判断一遍再提交!不要急着提交简介仓库里有若干个二次方数,请问是否能取出若干数使得刚好等于给定数?情况讨论情况1.仓库里只有一个4,但是我要求2,求不得情况2.仓库里有三个1,我要求3,能求大概思路从\(i\in[log2(v),0]\)遍历(从大到小),如果对于i,仓......
  • 题解 ABC333F【Bomb Game 2】
    来个可能有点麻烦但不用动脑子的暴力做法。直接设\(f_{i,j}\)表示有\(i\)个人时,第\(j\)个人幸存的概率。显然有\(f_{1,1}=1\)。对于\(i>1\),分类讨论容易得到:\[f_{i,j}=\begin{cases}\frac{f_{i,n}}{2},&j=1\\\frac{f_{i-1,j-1}+f_{i,j-1}}{2},&1<j\lei\\\e......
  • CF1906K Deck-Building Game记录
    CF1906KDeck-BuildingGame题目链接:https://codeforces.com/problemset/problem/1906/K题意有大小为$n$的多重集$A$。求找到两个不相交子集,使它们各自的异或和相等的方案数。很容易将其转换为求如下值:$$\sum_{S\subsetA}2^{|S|}\cdot[\oplus_{x\inS}x=0]$$......
  • pygame安装问题
    pygame的安装问题(1)python-mpipinstall--upgradepip(2)pipinstallpygame(3)更换下载网站,且赋予信任pipinstallpygame-ihttp://pypi.douban.com/simple--trusted-hostpypi.douban.com(4)python-mpipinstall-Upygame--user(5)python-mpipinstall-Upy......