uoj310【UNR #2】黎明前的巧克力(FWT)
uoj310【UNR #2】黎明前的巧克力(FWT)
题解时间
对非零项极少的FWT的优化。
首先有个十分好想的DP: $ f[i][j] $ 表示考虑了前 $ i $ 个且异或和为 $ j $ 的方案数,
有 $ f[i][j]= f[i-1][j] + 2 * f[i-1][j \oplus a[i]] $ 。
可以考虑FWT,但很明显时间复杂度没有优化。
但另一方面,每层的卷积卷的都是 $ 1,0,0,...,2,0,0,... $ 的形式,
这样一来卷之后每项都是 $ -1 $ 或 $ 3 $ 。
因此大胆一点直接把所有的式子加到一起卷积,
卷完有什么用呢?
这样卷出来的结果是每层卷积相加,而正常FWT求解是每层卷积相乘。
每一位都是共计 $ n $ 个 $ -1 $ 和 $ 3 $ 加一起,所以可以求出每一位上两种数的个数。
由于知道了每一位上两种数的个数,直接每一位快速幂就能求出原来的相乘结果。
#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
struct pat{int x,y;pat(int x=0,int y=0):x(x),y(y){}bool operator<(const pat &p)const{return x==p.x?y<p.y:x<p.x;}};
template<typename TP>inline void read(TP &tar)
{
TP ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){ret=ret*10+(ch-'0');ch=getchar();}
tar=ret*f;
}
template<typename TP,typename... Args>inline void read(TP& t,Args&... args){read(t),read(args...);}
namespace RKK
{
const int N=2000011;
const int defaultlen=1048576;
const int mo=998244353,inv2=499122177,inv4=748683265;
void doadd(int &a,int b){if((a+=b)>=mo) a-=mo;}int add(int a,int b){return (a+=b)>=mo?a-mo:a;}
void domul(int &a,int b){a=1ll*a*b%mo;}int mul(int a,int b){return 1ll*a*b%mo;}
int fpow(int a,int p){int ret=1;while(p){if(p&1) domul(ret,a);domul(a,a),p>>=1;}return ret;}
int n,a[N];
void fwtxor(int *a,int len,int tp)
{
for(int i=1,w1,w2;i<len;i<<=1)
for(int j=0;j<len;j+=i<<1)
for(int k=0;k<i;k++)
{
w1=a[j+k],w2=a[j+k+i];
a[j+k]=add(w1,w2),a[j+k+i]=add(w1,mo-w2);
if(tp==-1) domul(a[j+k],inv2),domul(a[j+k+i],inv2);
}
}
int main()
{
read(n);for(int i=1,w;i<=n;i++) read(w),a[0]+=1,a[w]+=2;
fwtxor(a,defaultlen,1);
for(int i=0,cnt1,cnt3;i<defaultlen;i++)
{
cnt3=mul(add(n,a[i]),inv4),cnt1=n-cnt3;
a[i]=(cnt1&1)?mo-fpow(3,cnt3):fpow(3,cnt3);
}
fwtxor(a,defaultlen,-1);
printf("%d\n",add(a[0],mo-1));
return 0;
}
}
int main(){return RKK::main();}
uoj310【UNR #2】黎明前的巧克力(FWT)的更多相关文章
- 【uoj#310】[UNR #2]黎明前的巧克力 FWT
题目描述 给出 $n$ 个数,从中选出两个互不相交的集合,使得第一个集合与第二个集合内的数的异或和相等.求总方案数. 输入 第一行一个正整数 $n$ ,表示巧克力的个数.第二行 $n$ 个整数 $a_ ...
- [UOJ310][UNR #2]黎明前的巧克力
uoj description 给你\(n\)个数,求从中选出两个交集为空的非空集合异或和相等的方案数模\(998244353\). sol 其实也就是选出一个集合满足异或和为\(0\),然后把它分成 ...
- UOJ #310 黎明前的巧克力 FWT dp
LINK:黎明前的巧克力 我发现 很多难的FWT的题 都和方程有关. 上次那个西行寺无余涅槃 也是各种解方程...(不过这个题至今还未理解. 考虑dp 容易想到f[i][j][k]表示 第一个人得到巧 ...
- UOJ310. 【UNR #2】黎明前的巧克力 [FWT]
UOJ 思路 显然可以转化一下,变成统计异或起来等于0的集合个数,这样一个集合的贡献是\(2^{|S|}\). 考虑朴素的\(dp_{i,j}\)表示前\(i\)个数凑出了\(j\)的方案数,发现这其 ...
- UOJ#310 【UNR #2】黎明前的巧克力 FWT 多项式
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ310.html 题目传送门 - UOJ#310 题意 给定 $n$ 个数 ,请你选出两个不相交的集合(两个 ...
- UOJ#310. 【UNR #2】黎明前的巧克力(FWT)
题意 题目链接 Sol 挂一个讲的看起来比较好的链接 然鹅我最后一步还是没看懂qwq.. 坐等SovietPower大佬发博客 #include<bits/stdc++.h> using ...
- [UOJ UNR#2 黎明前的巧克力]
来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 很奇妙的一道题 首先不难发现一个暴力做法,就是f[i]表示异或和为i的答案数,每次FWT上一个F数组,其中F[0]=1,F[ai]=2 ...
- UOJ #310 黎明前的巧克力 (FWT)
题目传送门 题目大意:给你一个序列,定义一个子序列的权值表示子序列中元素的异或和,现在让你选出两个互不相交的子序列,求选出的这两个子序列权值相等的方案数,$n,a_{i}\leq 10^{6}$ 这是 ...
- [FWT] UOJ #310. 【UNR #2】黎明前的巧克力
[uoj#310][UNR #2]黎明前的巧克力 FWT - GXZlegend - 博客园 f[i][xor],考虑优化暴力,暴力就是FWT xor一个多项式 整体处理 (以下FWT代表第一步) F ...
随机推荐
- Solution -「洛谷 P4389」付公主的背包
\(\mathcal{Description}\) Link. 容量为 \(n\),\(m\) 种物品的无限背包,求凑出每种容量的方案数,对 \(998244353\) 取模. \(n,m ...
- head 插件 Content-Type header [application/x-www-form-urlencoded] is not supported
{ "error": "Content-Type header [application/x-www-form-urlencoded] is not supported& ...
- 【Kotlin】初识Kotlin(二)
[Kotlin]初识Kotlin(二) 1.Kotlin的流程控制 流程控制是一门语言中最重要的部分之一,从最经典的if...else...,到之后的switch,再到循环控制的for循环和while ...
- 如何在3D场景中在模型上面绘制摄取点
有些时候,我们在屏幕上面绘制一个摄取点,在单屏玩游戏的模式下,我们并不能觉得有什么不妥.但是最近VR的热火朝天,我们带上眼镜看双屏的时候,总觉得这个摄取点看着很不舒服. 这个问题该怎么解决?在这里我首 ...
- 性能测试:k8s集群监控环境搭建(kube-prometheus)
选择kube-prometheus版本 k8s集群版本是1.22.x 5个节点 说明:如果你电脑配置低,也可以1个master节点,2个node节点 3个节点 Kube-Prometheus地址:ht ...
- 十一讲/十二讲 最近总是学不进去,这咋办啊 哭了我i我i我i
0: 2,9,7 错错错 帽号回来是列表 1:好像一样? 错错错 不一样,list[0]是一个值,冒号回来是个列表 2:A.insert(0,A[-1]) del A[-1] ...
- 在windev中实现BS架构级的灵活排版
windev是CS架构,但却能够实现BS架构级的灵活排版.玩过CS架构的老铁们,感受应会都如我,如获新生!因为苦于没有一张好画皮久矣!在windev中,要实现灵活,专业,自适应和非常丰富的排版,可以关 ...
- Kubernetes云供应商架构的未来
首先,我想分享SIG的使命,因为我们用它来指导我们现在和将来的工作.从我们的章程中直接来看,SIG的使命是简化,开发和维护云供应商集成,作为Kubernetes集群的扩展或附加组件.这背后的动机是双重 ...
- 【C#】通过一个案例 彻底了解 Volatile和 内存屏障
案例如下的.我个人理解是不会出现出现0,0的结果,但是很明显出现了. 说明对我对 Volatile\内存屏障\乱序排序的理解是不对. 今天就通过这个案例,理清这些概念. using System; u ...
- docker ——从docker容器的内部,连接本机的mysql
所以我有一个Nginx运行在一个docker容器,我有一个mysql运行在localhost,我想连接到我的Nginx内的MySql. MySql在localhost上运行,并且不将端口暴露给外部世界 ...