Little C Loves 3 III

给定 \(n\) 和序列 \(a_0,a_1,\dots,a_{2^n-1}\) 和 \(b_0,b_1,\dots,b_{2^n-1}\),求序列 \(c_0,c_1,\dots,c_{2^n-1}\) 满足

\[c_i=\left(\sum_{j|k=i,j\&k=0} a_j\cdot b_k\right)\bmod 4
\]

数据范围:\(a_i,b_i\in[0,3]\),\(0\le n\le 21\)。


看到 \(j|k=i\) 便知道要搞个 \(or\) 运算的 \(\texttt{FWT}\),但是如何使得同时满足条件 \(j\&k=0\) 呢?

设 \(bits(x)\) 表示 \(x\) 在二进制下的位数。

考虑如下 \(3\) 个可以利用的因素:

  1. \(\bmod 4\) 相当于在二进制下取两位。

  2. 同时满足 \(j|k=i,j\&k=0\) 必有 \(bits(j)+bits(k)=bits(i)\)。

  3. 如果满足 \(j|k=i\),且 \(bits(i)\) 一定,必有 \(bits(j)+bits(k)\ge bits(i)\)。

所以可以令 \(f_i=a_i\cdot 4^{bits(i)},g_i=b_i\cdot 4^{bits(i)}\),通过 \(\texttt{FWT}\) 得到 \(ans_i=\sum_{j|k=i}f_j\cdot g_k\),然后最后的答案 \(c_i=\left(\frac{ans_i}{4^{bits(i)}}\right)\bmod 4\)。


抽象地解释一下:

\(\texttt{[]}\) 表示两个二进制位(为 \(0\)),\(\texttt{<>}\) 表示其他(除了答案两位)位的值,是由 \(c_i\) 溢出两位或者由满足 \(bits(j)+bits(k)>bits(i)\) 的 \(j,k\) 变换得的值,可以抛弃。

\(f_j:a_j\underbrace{\texttt{[][]...[][]}}_{bits(j)'s \texttt{[]}}\)

\(g_k:b_k\underbrace{\texttt{[][]...[][]}}_{bits(k)'s \texttt{[]}}\)

\(ans_i:\texttt{<><>...<><>}c_i\underbrace{\texttt{[][]...[][]}}_{bits(i)'s \texttt{[]}}\)


小蒟蒻或许讲不清楚,但我就这个水平了。放代码吧,注意 \(f_j,g_k\) 开 \(\texttt{long long}\)。

//Data
const int M=21,N=1<<M;
int n,m,bit[N+7];
int bits(int x){return (x==0)?0:bit[x]?bit[x]:(bit[x]=bits(x-(x&-x))+1);} //FWT
void fwt(lng f[],int t){ //or fwt 模板
for(int mid=1;mid<n;mid<<=1)
for(int i=0;i<n;i+=mid<<1)
for(int j=i;j<mid+i;j++) f[mid+j]+=f[j]*t;
}
lng f[N+7],g[N+7],ans[N+7]; //Main
int main(){
n=1<<(m=ri);
for(int i=0,c;i<n;i++){
while(!isdigit(c=fr()));
f[i]=(15ll&c)<<(bits(i)<<1);
//这题是在 CF 上交的,有很多奇奇怪怪的错误,反正这里只能写 15ll&c,写 (lng)(c-'0') 都会挂
}
for(int i=0,c;i<n;i++){
while(!isdigit(c=fr()));
g[i]=(15ll&c)<<(bits(i)<<1);
}
fwt(f,1),fwt(g,1);
for(int i=0;i<n;i++) ans[i]=f[i]*g[i]; // CF 会显示这里挂了
fwt(ans,-1);
for(int i=0;i<n;i++) printf("%lld",(ans[i]>>(bits(i)<<1))&3);
putchar('\n');
return 0;
}

萌新初学多项式,巨佬多多指教,觉得写得不清楚就在评论中随意 \(\texttt{D}\)。祝大家学习愉快!

题解-Little C Loves 3 III的更多相关文章

  1. hdu 5266 pog loves szh III(lca + 线段树)

    I - pog loves szh III Time Limit:6000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I ...

  2. 【题解】DZY Loves Chinese

    [题解]DZY Loves Chinese II 不吐槽这题面了... 考虑如何维护图的连通性,如果把图的变成一颗的\(dfs\)生成树,那么如果把一个节点的父边和他接下来所有的返祖边删除,那么我们就 ...

  3. HDU 5266 pog loves szh III(区间LCA)

    题目链接 pog loves szh III 题意就是  求一个区间所有点的$LCA$. 我们把$1$到$n$的$DFS$序全部求出来……然后设$i$的$DFS$序为$c[i]$,$pc[i]$为$c ...

  4. HDU 5266 pog loves szh III ( LCA + SegTree||RMQ )

    pog loves szh III Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Oth ...

  5. 题解-ARC058D Iroha Loves Strings

    题面 ARC058D Iroha Loves Strings 给定 \(n\) 个字符串,从中选出若干个按给出顺序连接起来,总长等于 \(m\),求字典序最小的,保证有解. 数据范围:\(1\le n ...

  6. 洛谷月赛2018.8 T1题解(U28036 Nagisa loves Tomoya)

    [题解] 我们设原来的数组为a1,a2,a3..., 那么一次操作之后的数组变为a1+a2,a2+a3,a3+a4..., 两次操作之后数组变为a1+2a2+a3,a2+2a3+a4,a3+2a4+a ...

  7. HDU 5266 pog loves szh III (LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5266 题目就是让你求LCA,模版题.注意dfs会栈溢出,所以要扩栈,或者用bfs写. #pragma ...

  8. HDU 5266 pog loves szh III

    题意:给出一棵树,1为根节点,求一段区间内所有点的最近公共祖先. 解法:用一棵线段树维护区间LCA.LCA是dp做法.dp[i][j]表示点i的第2^j个祖先是谁,转移方程为dp[i][j] = dp ...

  9. HDU 5266 pog loves szh III (线段树+在线LCA转RMQ)

    题目地址:HDU 5266 这题用转RMQ求LCA的方法来做的很easy,仅仅须要找到l-r区间内的dfs序最大的和最小的就能够.那么用线段树或者RMQ维护一下区间最值就能够了.然后就是找dfs序最大 ...

随机推荐

  1. 部署Dotnet Core应用到Kubernetes(二)

    前一篇文章,概念性地介绍了K8s的一些基础组件,如Pod.部署和服务.这篇文章,我打算写写如何使用YAML清单定义和配置这些资源.   实际上,在K8s集群中创建对象有几种方式 - 命令,或声明.两种 ...

  2. Python_异常处理、调试

    1.try except 机制 # 错误处理 # 一般程序都要用到错误捕获,当没有加且有错误的时候Python解释器会执行错误捕获,且是一层层向上捕获[所以问题点会在最下面] try: print(' ...

  3. Cpython的全局解释器锁(GIL)

    # Cpyrhon解释器下有个全局解释器锁-GIL:在同一 # 在同一时刻,多线程中只有一个线程访问CPU # 有了全局解释器锁(GIL)后,在同一时刻只能有一个线程访问CPU. # 全局解释器锁锁的 ...

  4. Blazor入手教程(一)前言

    Blazor入手教程(一)前言 结论 最近在学习blazor.得出了这么一个结论: Blazor是一门很值得学习的技术,未来.net下将会有相当多的 web应用使用blazor开发.十分看好这一技术, ...

  5. 微信支付回调 敏感信息解密 v3 php

    今天博主用了一波微信的v3版本的支付,支付成功后发现回调跟v2的完全不一样,于是去看了了一波v3的文档,发现信息是经过加密的,需要解密才能获取的到 但是最悲催的是文档上没写怎么解密的,经过了一下午的百 ...

  6. Go-Web编程_表单_0x02_验证表单的输入

    开发Web的一个原则就是,不能信任用户输入的任何信息,所以验证和过滤用户的输入信息就变得非常重要,我们经常会在微博.新闻中听到某某网站被入侵了,存在什么漏洞,这些大多是因为网站对于用户输入的信息没有做 ...

  7. 【PYTEST】第一章常用命令

    pytest入门 安装pytest 运行pytest pytest常用命令 1. 安装pytest pip install pytest 2. 运行pytest 2.1 pytest默认搜索当前目录下 ...

  8. 【Redis】【报错】redis.exceptions.ResponseError: DENIED Redis is running in protected mode

    (一)报错前提 写flask 项目的时候,因为连接了私有云中的redis地址指定了IP host,启动项目的时候报错 (二)解决方法 首先要切换到root用户 root@:/etc/redis# pw ...

  9. HarmonyOS Java UI之DependentLayout布局示例

    DependentLayout简介 DependentLayout意为相对位置布局,与DirectionalLayout相比较有更多的排布方式,每个组件可以指定相对于其他同级组件的位置,也可以指定相对 ...

  10. sublime text3配置javascript运行环境

    步骤一 安装node.js 官网下载链接:node.js 步骤二 Sublime 依次点击 菜单栏 Tools => Build System => New Build System 步骤 ...