\(\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的更多相关文章

  1. Solution -「Gym 102979E」Expected Distance

    \(\mathcal{Description}\)   Link.   用给定的 \(\{a_{n-1}\},\{c_n\}\) 生成一棵含有 \(n\) 个点的树,其中 \(u\) 连向 \([1, ...

  2. Solution -「Gym 102979L」 Lights On The Road

    \(\mathcal{Description}\)   Link.   给定序列 \(\{w_n\}\),选择 \(i\) 位置的代价为 \(w_i\),要求每个位置要不被选择,要不左右两个位置至少被 ...

  3. Solution -「Gym 102956F」Find the XOR

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个点 \(m\) 条边的连通无向图 \(G\),边有边权.其中 \(u,v\) 的距离 \(d(u,v)\) ...

  4. Solution -「Gym 102956B」Beautiful Sequence Unraveling

    \(\mathcal{Description}\)   Link.   求长度为 \(n\),值域为 \([1,m]\) 的整数序列 \(\lang a_n\rang\) 的个数,满足 \(\not\ ...

  5. Solution -「Gym 102956F」Border Similarity Undertaking

    \(\mathcal{Description}\)   Link.   给定一张 \(n\times m\) 的表格,每个格子上写有一个小写字母.求其中长宽至少为 \(2\),且边界格子上字母相同的矩 ...

  6. Solution -「Gym 102798I」Sean the Cuber

    \(\mathcal{Description}\)   Link.   给定两个可还原的二阶魔方,求从其中一个状态拧到另一个状态的最小步数.   数据组数 \(T\le2.5\times10^5\). ...

  7. Solution -「Gym 102798K」Tree Tweaking

    \(\mathcal{Description}\)   Link.   给定排列 \(\{p_n\}\),求任意重排 \(p_{l..r}\) 的元素后,将 \(\{p_n\}\) 依次插入二叉搜索树 ...

  8. Solution -「Gym 102798E」So Many Possibilities...

    \(\mathcal{Description}\)   Link.   给定非负整数序列 \(\{a_n\}\) 和 \(m\),每次随机在 \(\{a\}\) 中取一个非零的 \(a_i\)(保证存 ...

  9. Solution -「Gym 102759I」Query On A Tree 17

    \(\mathcal{Description}\)   Link.   给定一棵含 \(n\) 个结点的树,结点 \(1\) 为根,点 \(u\) 初始有点权 \(a_u=0\),维护 \(q\) 次 ...

随机推荐

  1. Go语言系列- http编程和mysql

    http编程 一.Http协议  1. 什么是协议? 协议,是指通信的双方,在通信流程或内容格式上,共同遵守的标准.  2. 什么是http协议? http协议,是互联网中最常见的网络通信标准.  3 ...

  2. 创建VS Code 扩展插件

    VS Code提供了强大的扩展功能,我们可以通过开发插件实现自己的业务模型编辑器.这里我们快速介绍一下插件的创建.开发和发布过程. 创建插件开发模板 首先需要确认系统中安装了node.js,并且可以使 ...

  3. Redis内存分析工具之redis-rdb-tools的安装与使用

    操作系统:Centos7    1.redis-rdb-tools工具是用python语言编写的,所以首先需要安装python: 安装: (1)用 wget 下载 python 2.7 并解压( 如果 ...

  4. 原子操作atomic解读

    下面从一个问题引入: // ConsoleApplication5.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include<ran ...

  5. CTF web安全45天入门学习路线

    前言 因为最近在准备开发CTF学习平台,先做一个学习路线的整理,顺便也是对想学web的学弟学妹的一些建议. 学习路线 初期 刚刚走进大学,入了web安全的坑,面对诸多漏洞必然是迷茫的,这时的首要任务就 ...

  6. 第05讲:Flink SQL & Table 编程和案例

    Flink系列文章 第01讲:Flink 的应用场景和架构模型 第02讲:Flink 入门程序 WordCount 和 SQL 实现 第03讲:Flink 的编程模型与其他框架比较 第04讲:Flin ...

  7. db2日志模式、备份归档、恢复解析

    DB2的日志分为两种模式,日志循环与归档日志,也就是非归档和归档模式.下面就具体介绍一下这两种方式以及和备份归档设置的关系. 一.日志循环 这是默认方式,也就是非归档模式,这种模式只支持(backup ...

  8. Vue之 css3 样式重置 代码

    reset.css @charset "utf-8";html{background-color:#fff;color:#000;font-size:12px} body,ul,o ...

  9. AWS 模拟题知识点总结!

    一 题库的地址 https://www.lleicloud.com/index.php/aws-certified-saa-c01-practice-questions-c6-01/ 二 总结的知识点 ...

  10. Elasticsearch(2) 数据搜索

    本文介绍如何在Elasticsearch中对数据进行搜索. 1.简述 在Elasticsearch中的搜索中,有两类搜索: queries aggregations 区别在于:query可以进行全文搜 ...