BZOJ4589 Hard Nim 【FWT】】的更多相关文章

题目链接 BZOJ4589 题解 FWT 模板题 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<vector> #include<queue> #include<cmath> #include<map> #define LL long long…
正题 题目链接:https://darkbzoj.tk/problem/4589 题目大意 求有多少个长度为\(n\)的数列满足它们都是不大于\(m\)的质数且异或和为\(0\). 解题思路 两个初始多项式\(F[0]=1\),\(G[prime\leq m]=1\),然后答案就是\(F\ xor\ G^n\).然后\(\text{FWT}\)之后点值快速幂就好了. 时间复杂度\(O(n\log n)\) \(\color{white}{写水题有助于背板}\) code #include<cst…
DescriptionNim is a 2-player game featuring several piles of stones. Players alternate turns, and on his/her turn, a player’s move consists of removing one or more stones from any single pile. Play ends when all the stones have been removed, at which…
题目分析: 好题.本来是一道好的非套路题,但是不凑巧的是当年有一位国家集训队员正好介绍了这个算法. 首先考虑静态的情况.这个的DP方程非常容易写出来. 接着可以注意到对于异或结果的计数可以看成一个FWT的过程,进一步地可以注意到FWT在中途没有还原的必要.从FWT的过程中我们可以发现FWT具有可加性和交换律结合律. 这样原问题可以在静态的情况下通过树形DP做到$O(nm)$. 考虑动态的问题.根据<神奇的子图>命题报告及其拓展中描述的算法五,我们应该不难想到基于树链剖分的这样的做法. 首先对树…
题目链接 hdu6057 题意 给出序列\(A[0...2^{m} - 1]\)和\(B[0...2^{m} - 1]\),求所有 \[C[k] = \sum\limits_{i \; and \; j = k} A[i \; xor \; j]B[i \; or \; j]\] 题解 我只能感叹太神了 看到题目我是懵逼的 首先注意三者运算的关系: \[(i \; and \; j) + (i \; xor \; j) = (i \; or \; j)\] 证明显然 于是我们枚举\(x = i…
题目链接 CSU1911 题解 FWT模板题 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<vector> #include<queue> #include<cmath> #include<map> #define LL long long in…
Description Solution 我们考虑将问题一步步拆解 第一步求出\(F_{S,i}\)表示一次旅行按位与的值为S,走了i步的方案数. 第二步答案是\(F_{S,i}\)的二维重复卷积,记答案为\(S_{S,i}\),那么\(F_{S,i}\times S_{T,j}\)能够贡献到\(S_{S\&T,i+j}\). 上下两部分是两个问题,我们分开来看. 考虑第一步 设原矩阵为A 根据定义,\[F_{S,i}=\sum\limits_{x\&y=T}A^i_{x,y}\] 容易看…
题目大意:有一个无限长的一维的棋盘,棋盘上N个格子放置着棋子.两个人轮流操作,每次操作能选择其中一个棋子向左移动,但不能越过其它棋子或者两枚棋子放在同一格中,最后不能操作的人算输,问先手是否必胜? 思路:就是裸的阶梯博弈(staircase nim)方法也很简单.首先每个棋子能向右移动的距离是有限的,最多到前一个棋子处就停止了,比如第一个sample :1 2 3 每个棋子都不能移动就是 0 0 0 第二个sample: 1 5 6 7 9 12 14 17 就是0 3 0 0 1 2 1 2…
Description 你有一个随机数生成器,它会以一定的概率生成[0,2^N-1]中的数,每一个数的概率是由序列A给定的,Pi=Ai/sum(Ai) 现在有一个初始为0的数X,每一轮随机生成一个数v,将X变成X xor v 求X变成0~2^N-1的期望轮数 答案对998244353取模 N<=18,Ai<=1000 Solution 不妨反过来做,f[i]为i到0的期望轮数,显然等价 易得i>0, \[f[i]=1+\sum f[i\ xor\ j]p[j]\] 1移到左边来 \[f[…
CF662C Binary Table 题意: 给出一个\(n\times m\)的\(01\)矩阵,每次可以反转一行或者一列,问经过若干次反转之后,最少有多少个\(1\) \(n\le 20, m\le 10^5\) 题解: 可以把每一列看作一个二进制数,这样得到\(m\)个二进制数,记为\(A\),翻转第\(i\)列就相当于把每个二进制数异或上\(1<<i\),由于\(n\)很小,所以枚举所有的翻转组合,一共\(2^n\)种,令\(d(x)\)表示最高位为\(n\)的二进制数中\(0\)和…
正题 题目链接:https://www.luogu.com.cn/problem/CF1119H 题目大意 \(n\)个可重集,第\(i\)个里有\(x\)个\(a_i\),\(y\)个\(b_i\),\(z\)个\(c_i\). 对于每个\(t\in[0,2^k)\)求每个集合里取出一个数使它们异或起来等于\(t\)的方案数. 解题思路 如果直接\(n\)个东西\(FWT\)起来肯定过不了,我们需要根据每个集合里只有三种数这个性质来优化. 因为是\(xor\)卷积,所以第\(i\)个位置\(F…
正题 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5909 题目大意 给出\(n\)和\(m\)(\(m=2^k\)).再给出一个大小为\(n\)的树,每个点有点权,对于每个\(i\in[1,m)\)求有多少个联通子图的点权异或和为\(i\) \(1\leq T\leq 10,1\leq n\leq 1000,1\leq m\leq 2^{10}\) 解题思路 设\(f_{i,j}\)表示\(i\)的子树中包含\(i\)的联通子图里面,异或和为\…
Description 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略的.于是vfleaking决定写一个玩Nim游戏的平台来坑玩家.为了设计漂亮一点的初始局面,vfleaking用以下方式来找灵感:拿出很多石子,把它们聚成一堆一堆的,对每一堆编号1,2,3,4,...n,在堆与堆间连边,没有自环与重边,从任意堆到任意堆都只有唯一一条路径可到达.然后他不…
Description Georgia and Bob decide to play a self-invented game. They draw a row of grids on paper, number the grids from left to right by 1, 2, 3, ..., and place N chessmen on different grids, as shown in the following figure for example: Georgia an…
[HDU3032]Nim or not Nim?(博弈论) 题面 HDU 题解 \(Multi-SG\)模板题 #include<iostream> #include<cstdio> using namespace std; inline int read() { int x=0;bool t=false;char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-'…
[BZOJ4911][SDOI2017]切树游戏(动态dp,FWT) 题面 BZOJ 洛谷 LOJ 题解 首先考虑如何暴力\(dp\),设\(f[i][S]\)表示当前以\(i\)节点为根节点,联通子树权值和为\(S\)的方案数,转移就是\(FWT\)的卷积,最后只需要把所有的\(f[i][k]\)全部加起来就可以得到最终的答案. 于是这样子的复杂度就是\(O(Qnmlogm)\).但实际上转移的时候不需要\(FWT\)回来,直接拿点值表示的数组做就可以了,这样子可以少一个\(log\). 那么…
[CF850E]Random Elections(FWT) 题面 洛谷 CF 题解 看懂题就是一眼题了... 显然三个人是等价的,所以只需要考虑一个人赢了另外两个人就好了. 那么在赢另外两个人的过程中,一定是两个长度为\(2^n\)的二进制串的对应值都是\(1\). 考虑每个人投票的贡献,如果是\(00\)或者\(11\)那么有两种排列,如果是\(01\)或者\(10\)就只有一种合法排列. 那么对于长度为\(2^n\)的数组自己对自己做一次异或卷积,每个数的贡献就是\(2\)的\(0\)的个数…
[WC2018]州区划分(FWT,动态规划) 题面 UOJ 洛谷 题解 首先有一个暴力做法(就有\(50\)分了) 先\(O(2^nn^2)\)预处理出每个子集是否合法,然后设\(f[S]\)表示当前的答案,每次枚举一个子集进行转移,得到方程:\(\displaystyle f[S]=(\frac{1}{W_s})^p\sum_{T\subset S}f[T]*(W_{S-T})^p*check[S-T]\). 其中\(W\)表示权值和,\(check\)表示是否合法. 这样子的复杂度是\(O(…
[CF662C]Binary Table(FWT) 题面 洛谷 CF 翻译: 有一个\(n*m\)的表格(\(n<=20,m<=10^5\)), 每个表格里面有一个\(0/1\), 每次可以将一行或者一列的\(01\)全部翻转 回答表格中最少有多少个\(1\) 题解 发现\(n\)很小,\(m\)很大 状压是跑不掉了 如果我们确定翻转哪些行,那么答案唯一确定(贪心的选每一列中\(0/1\)的较小值) 相同的列显然可以合并, 把每一列按照\(01\)状压,记\(a[i]\)为状态为\(i\)的列…
[BZOJ5019][SNOI2017]遗失的答案(FWT,动态规划) 题面 BZOJ 题解 发现\(10^8\)最多分解为不超过\(8\)个本质不同质数的乘积. 而\(gcd\)和\(lcm\)分别就是每个质因子的最大次幂和最小次幂的乘积. 那么考虑一个状压\(dp\),设\(f[S1][S2]\)表示最小/最大次幂是否被取到的方案数. 而能够被统计入答案的数一定是在\(gcd\)和\(lcm\)之间的数,并且是\(gcd\)的倍数,\(lcm\)的因数. 直接爆搜,这样的数不会太多.然后可以…
[CF582E]Boolean Function 题意:给你一个长度为n的表达式,其中未知数有A,B,C,D和?,运算有&和|和?(表达式中用括号确定了唯一的运算顺序).?代表A,B,C,D或&,|.A,B,C,D的值是0或1.再给你m个条件$a,b,c,d,e$,代表A,B,C,D分别等于a,b,c,d时表达式的值为e.求有多少种将?填满的方式,符合给出的所有条件? $n\le 500,m\le 2^4$ 题解:CF总考这种用二进制表示特殊状态的题,感觉十分考验人类的抽象能力. 因为变量…
[HDU5909]Tree Cutting(FWT) 题面 vjudge 题目大意: 给你一棵\(n\)个节点的树,每个节点都有一个小于\(m\)的权值 定义一棵子树的权值为所有节点的异或和,问权值为\(0..m-1\)的所有子树的个数 题解 考虑\(dp\) 设\(f[i][j]\)表示以\(i\)为根节点的子树中,异或和为\(j\)的子树的个数 很显然,每次合并就是两个\(dp\)值做\(xor\)卷积 那么直接用\(FWT\)优化就行了 #include<iostream> #inclu…
[BZOJ4036][HAOI2015]按位或 Description 刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行或(c++,c的|,pascal的or)操作.选择数字i的概率是p[i].保证0<=p[i]<=1,Σp[i]=1问期望多少秒后,你手上的数字变成2^n-1. Input 第一行输入n表示n个元素,第二行输入2^n个数,第i个数表示选到i-1的概率 Output 仅输出一个数表示答案,绝对误差或相对误差不超过1e-6即可算通过.如果无…
[CF662A]Gambling Nim 题意:n长卡牌,第i张卡牌正面的数字是$a_i$,反面的数字是$b_i$,每张卡牌等概率为正面朝上或反面朝上.现在Alice和Bob要用每张卡牌朝上的数字玩NIM游戏,问先手获胜的概率. $n\le 5000,a_i,b_i\le 10^{18}$ 题解:傻逼题都不会了,先令所有的都是正面朝上,再令$S=a_1\ \text{xor}\ a_2...a_n,c_i=a_i\ \text{xor}\ b_i$,则问题变成了选出一些$c_i$使得异或和为$S…
[CF772D]Varying Kibibits 题意:定义函数f(a,b,c...)表示将a,b,c..的10进制下的每一位拆开,分别取最小值组成的数.如f(123,321)=121,f(530, 932, 81)=30.给你一个数集$T={a_1,a_2...a_n}$,定义函数G(x) 求$G(1)\oplus G(2)\oplus ...G(999999)$. $1\le n \le 1000000,0\le a_i \le 999999$ 题解:发现f函数就是10进制下的按位与,所以我…
[CF850E]Random Elections 题意:有n位选民和3位预选者A,B,C,每个选民的投票方案可能是ABC,ACB,BAC...,即一个A,B,C的排列.现在进行三次比较,A-B,B-C,C-A.每次比较的结果由一个给定的函数决定$f(x):{0,1}^n\rightarrow {0,1}$,即读入一个长度为n的bool数组,返回一个bool变量.假如是A和B比较,则读入数组的第i个bool是 第i个人的排列中,A是否在B的前面:返回的bool是 A获胜还是B获胜.现在给你函数f(…
题意:求n个m以内的素数亦或起来为0的方案数 题解:fwt板子题,先预处理素数,把m以内素数加一遍(下标),然后fwt之后快速幂即可,在ifwt之后a[0]就是答案了 /************************************************************** Problem: 4589 User: walfy Language: C++ Result: Accepted Time:4984 ms Memory:1928 kb *****************…
[BZOJ4036]按位或(Min-Max容斥,FWT) 题面 BZOJ 洛谷 题解 很明显直接套用\(min-max\)容斥. 设\(E(max\{S\})\)表示\(S\)中最晚出现元素出现时间的期望,\(min\)同理. 那么\(E(max\{S\})=\sum_{T\subseteq S}(-1)^{|T|}E(min\{T\})\) 考虑怎么求\(E(min\{T\})\),很容易发现只需要或上了任何一位就行了. 也就是 \[E(min\{T\})=\frac{1}{\sum_{G\c…
[BZOJ3105]新Nim游戏(线性基) 题面 BZOJ Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿.拿走最后一根火柴的游戏者胜利. 本题的游戏稍微有些不同:在第一个回合中,第一个游戏者可以直接拿走若干个整堆的火柴.可以一堆都不拿,但不可以全部拿走.第二回合也一样,第二个游戏者也有这样一次机会.从第三个回合(…
[CSU1911]Card Game(FWT) 题面 vjudge 题目大意: 给定两个含有\(n\)个数的数组 每次询问一个数\(x\),回答在每个数组中各选一个数,或起来之后的结果恰好为\(x\)的方案数. 题解 \(FWT\)的模板题 \(FWT\)写起来是真的舒服 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath>…