Solution -「Gym 102956A」Belarusian State University
\(\mathcal{Description}\)
Link.
给定两个不超过 \(2^n-1\) 次的多项式 \(A,B\),对于第 \(i\in[0,n)\) 个二进制位,定义任意一个二元加法 \(\oplus_i:\{0,1\}\times\{0,1\}\rightarrow\{0,1\}\),而对于两个整数 \(u,v\in[0,2^n)\),定义 \(u\oplus v=\sum_{i=0}^{n-1}(u_i\oplus_i v_i)2^i\)。求 \(A,B\) 的 \(\oplus\) 卷积,保证答案任意系数不超过 \(2^{63}-1\)。
\(\mathcal{Solution}\)
可以看出这个问题不弱于 FWT,所以我们大概需要根据 FWT 的思路,来 DIY 一个变换。
在 FWT 的框架下,枚举每个二进制位,对 \(16\) 种不同的加法分别构造各自的变换方式,构造时只需要考虑 \((a_0+a_1x)\) 与 \((b_0+b_1x)\) 的卷积,使得这个卷积合法即可。
复杂度 \(\mathcal O(2^nn)\)。
\(\mathcal{Code}\)
不要用 switch
!不要用 switch
!不要用 switch
!这个语法真的离谱。
啊……极少地在代码里爆了粗口,以记录我分类讨论加上被 switch
弄傻的愉悦!(
/*~Rainybunny~*/
#include <cstdio>
#include <cassert>
#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i )
typedef long long LL;
const int MAXN = 18, MAXL = 1 << MAXN;
int n;
LL a[MAXL + 5], b[MAXL + 5];
char op[MAXN + 5][4];
inline int type( const char* o ) {
int ret = 0;
per ( i, 3, 0 ) ret = ret << 1 | ( o[i] ^ '0' );
return ret;
}
inline void fuckin_wa_tle( const int len, LL* u, const int tp ) {
// { -1: first item, 0: result, 1: second item }.
#define swp( a, b ) void( a ^= b ^= a ^= b )
for ( int i = 0, stp = 1; stp < len; ++i, stp <<= 1 ) {
for ( int j = 0; j < len; j += stp << 1 ) {
rep ( k, j, j + stp - 1 ) {
LL &p = u[k], &q = u[k + stp];
switch ( type( op[i] ) ) {
// what fuckin stupid grammar??? I'll never `switch` again.
case 0:
if ( !~tp ) p += q, q = 0;
else if ( tp ) p += q, q = 0;
break;
case 1:
if ( !~tp ) swp( p, q ), p += q;
else if ( tp ) swp( p, q ), p += q;
else p -= q;
break;
case 2:
if ( !~tp ) swp( p, q ), p += q;
else if ( tp ) p += q;
else p -= q;
break;
case 3:
if ( !~tp ) swp( p, q );
else if ( tp ) p = q = p + q;
break;
case 4:
if ( !~tp ) p += q;
else if ( tp ) swp( p, q ), p += q;
else p -= q;
break;
case 5:
if ( !~tp ) p = q = p + q;
else if ( tp == 1 ) swp( p, q );
break;
case 6:
p += q, q = p - 2 * q;
if ( !tp ) {
assert( !( p % 2 ) && !( q % 2 ) );
p /= 2, q /= 2;
}
break;
case 7:
if ( !~tp ) swp( p, q ), q += p;
else if ( tp ) swp( p, q ), q += p;
else q -= p;
break;
case 8:
if ( !~tp ) p += q;
else if ( tp ) p += q;
else p -= q;
break;
case 9:
q += p, p = q - 2 * p;
if ( !tp ) {
assert( !( p % 2 ) && !( q % 2 ) );
p /= 2, q /= 2;
}
break;
case 10:
if ( !~tp ) p = q = p + q;
break;
case 11:
if ( !~tp ) swp( p, q ), q += p;
else if ( tp ) q += p;
else q -= p;
break;
case 12:
if ( tp == 1 ) p = q = p + q;
break;
case 13:
if ( !~tp ) q += p;
else if ( tp ) swp( p, q ), q += p;
else q -= p;
break;
case 14:
if ( !~tp ) q += p;
else if ( tp ) q += p;
else q -= p;
break;
case 15:
if ( !~tp ) q += p, p = 0;
else if ( tp ) q += p, p = 0;
break;
default: assert( false );
}
}
}
}
#undef swp
}
int main() {
scanf( "%d", &n );
rep ( i, 0, n - 1 ) scanf( "%s", op[i] );
rep ( i, 0, ( 1 << n ) - 1 ) scanf( "%lld", &a[i] );
rep ( i, 0, ( 1 << n ) - 1 ) scanf( "%lld", &b[i] );
fuckin_wa_tle( 1 << n, a, -1 ), fuckin_wa_tle( 1 << n, b, 1 );
rep ( i, 0, ( 1 << n ) - 1 ) a[i] *= b[i];
fuckin_wa_tle( 1 << n, a, 0 );
rep ( i, 0, ( 1 << n ) - 1 ) {
printf( "%lld%c", a[i], i < repi ? ' ' : '\n' );
}
return 0;
}
Solution -「Gym 102956A」Belarusian State University的更多相关文章
- Solution -「Gym 102979E」Expected Distance
\(\mathcal{Description}\) Link. 用给定的 \(\{a_{n-1}\},\{c_n\}\) 生成一棵含有 \(n\) 个点的树,其中 \(u\) 连向 \([1, ...
- Solution -「Gym 102979L」 Lights On The Road
\(\mathcal{Description}\) Link. 给定序列 \(\{w_n\}\),选择 \(i\) 位置的代价为 \(w_i\),要求每个位置要不被选择,要不左右两个位置至少被 ...
- Solution -「Gym 102956F」Find the XOR
\(\mathcal{Description}\) Link. 给定 \(n\) 个点 \(m\) 条边的连通无向图 \(G\),边有边权.其中 \(u,v\) 的距离 \(d(u,v)\) ...
- Solution -「Gym 102956B」Beautiful Sequence Unraveling
\(\mathcal{Description}\) Link. 求长度为 \(n\),值域为 \([1,m]\) 的整数序列 \(\lang a_n\rang\) 的个数,满足 \(\not\ ...
- Solution -「Gym 102956F」Border Similarity Undertaking
\(\mathcal{Description}\) Link. 给定一张 \(n\times m\) 的表格,每个格子上写有一个小写字母.求其中长宽至少为 \(2\),且边界格子上字母相同的矩 ...
- Solution -「Gym 102798I」Sean the Cuber
\(\mathcal{Description}\) Link. 给定两个可还原的二阶魔方,求从其中一个状态拧到另一个状态的最小步数. 数据组数 \(T\le2.5\times10^5\). ...
- Solution -「Gym 102798K」Tree Tweaking
\(\mathcal{Description}\) Link. 给定排列 \(\{p_n\}\),求任意重排 \(p_{l..r}\) 的元素后,将 \(\{p_n\}\) 依次插入二叉搜索树 ...
- Solution -「Gym 102798E」So Many Possibilities...
\(\mathcal{Description}\) Link. 给定非负整数序列 \(\{a_n\}\) 和 \(m\),每次随机在 \(\{a\}\) 中取一个非零的 \(a_i\)(保证存 ...
- Solution -「Gym 102759I」Query On A Tree 17
\(\mathcal{Description}\) Link. 给定一棵含 \(n\) 个结点的树,结点 \(1\) 为根,点 \(u\) 初始有点权 \(a_u=0\),维护 \(q\) 次 ...
随机推荐
- Go语言系列- http编程和mysql
http编程 一.Http协议 1. 什么是协议? 协议,是指通信的双方,在通信流程或内容格式上,共同遵守的标准. 2. 什么是http协议? http协议,是互联网中最常见的网络通信标准. 3 ...
- 创建VS Code 扩展插件
VS Code提供了强大的扩展功能,我们可以通过开发插件实现自己的业务模型编辑器.这里我们快速介绍一下插件的创建.开发和发布过程. 创建插件开发模板 首先需要确认系统中安装了node.js,并且可以使 ...
- Redis内存分析工具之redis-rdb-tools的安装与使用
操作系统:Centos7 1.redis-rdb-tools工具是用python语言编写的,所以首先需要安装python: 安装: (1)用 wget 下载 python 2.7 并解压( 如果 ...
- 原子操作atomic解读
下面从一个问题引入: // ConsoleApplication5.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include<ran ...
- CTF web安全45天入门学习路线
前言 因为最近在准备开发CTF学习平台,先做一个学习路线的整理,顺便也是对想学web的学弟学妹的一些建议. 学习路线 初期 刚刚走进大学,入了web安全的坑,面对诸多漏洞必然是迷茫的,这时的首要任务就 ...
- 第05讲:Flink SQL & Table 编程和案例
Flink系列文章 第01讲:Flink 的应用场景和架构模型 第02讲:Flink 入门程序 WordCount 和 SQL 实现 第03讲:Flink 的编程模型与其他框架比较 第04讲:Flin ...
- db2日志模式、备份归档、恢复解析
DB2的日志分为两种模式,日志循环与归档日志,也就是非归档和归档模式.下面就具体介绍一下这两种方式以及和备份归档设置的关系. 一.日志循环 这是默认方式,也就是非归档模式,这种模式只支持(backup ...
- Vue之 css3 样式重置 代码
reset.css @charset "utf-8";html{background-color:#fff;color:#000;font-size:12px} body,ul,o ...
- AWS 模拟题知识点总结!
一 题库的地址 https://www.lleicloud.com/index.php/aws-certified-saa-c01-practice-questions-c6-01/ 二 总结的知识点 ...
- Elasticsearch(2) 数据搜索
本文介绍如何在Elasticsearch中对数据进行搜索. 1.简述 在Elasticsearch中的搜索中,有两类搜索: queries aggregations 区别在于:query可以进行全文搜 ...