题目大意:给你两个多项式$A,B$,求多项式$C$使得:
$$
C_n=\sum\limits_{x|y=n}A_xB_y
$$
题解:$FWT$,他可以解决形如$C_n=\sum\limits_{x\oplus y=n}A_xB_y$的问题,其中$\oplus$为位运算(一般为$or,and,xor$)

or:

void FWT(int *A) {
for (int mid = 1; mid < lim; mid <<= 1)
for (int i = 0; i < lim; i += mid << 1)
for (int j = 0; j < mid; ++j) A[i + j + mid] += A[i + j];
}
void IFWT(int *A) {
for (int mid = 1; mid < lim; mid <<= 1)
for (int i = 0; i < lim; i += mid << 1)
for (int j = 0; j < mid; ++j) A[i + j + mid] -= A[i + j];
}

  

and:

void FWT(int *A) {
for (int mid = 1; mid < lim; mid <<= 1)
for (int i = 0; i < lim; i += mid << 1)
for (int j = 0; j < mid; ++j) {
int X = A[i + j], Y = A[i + j + mid];
A[i + j] = X + Y, A[i + j + mid] = X - Y;
}
}
void IFWT(int *A) {
for (int mid = 1; mid < lim; mid <<= 1)
for (int i = 0; i < lim; i += mid << 1)
for (int j = 0; j < mid; ++j) {
int X = A[i + j], Y = A[i + j + mid];
A[i + j] = X + Y, A[i + j + mid] = X - Y;
}
for (int i = 0; i < lim; ++i) A[i] /= lim;
}

  

xor:

void FWT(int *A) {
for (int mid = 1; mid < lim; mid <<= 1)
for (int i = 0; i < lim; i += mid << 1)
for (int j = 0; j < mid; ++j) {
int X = A[i + j], Y = A[i + j + mid];
A[i + j] = X + Y, A[i + j + mid] = X - Y;
}
}
void IFWT(int *A) {
for (int mid = 1; mid < lim; mid <<= 1)
for (int i = 0; i < lim; i += mid << 1)
for (int j = 0; j < mid; ++j) {
int X = A[i + j], Y = A[i + j + mid];
A[i + j] = X + Y, A[i + j + mid] = X - Y;
}
for (int i = 0; i < lim; ++i) A[i] /= lim;
}

  

卡点:

C++ Code:

#include <cstdio>
#include <cctype>
inline int read() {
static int ch;
while (isspace(ch = getchar())) ;
return ch & 15;
} #define N 1048576
int lim;
inline void init(const int n) {
lim = 1; while (lim < n) lim <<= 1;
}
inline void FWT(long long *A) {
for (int mid = 1; mid < lim; mid <<= 1)
for (int i = 0; i < lim; i += mid << 1)
for (int j = 0; j < mid; ++j) A[i + j + mid] += A[i + j];
}
inline void IFWT(long long *A) {
for (int mid = 1; mid < lim; mid <<= 1)
for (int i = 0; i < lim; i += mid << 1)
for (int j = 0; j < mid; ++j) A[i + j + mid] -= A[i + j];
} int n;
long long A[N], B[N];
int main() {
scanf("%d", &n);
for (int i = 0; i < n; ++i) A[i] = read();
for (int i = 0; i < n; ++i) B[i] = read();
init(n);
FWT(A), FWT(B);
for (int i = 0; i < lim; ++i) A[i] *= B[i];
IFWT(A);
for (int i = 0; i < n; ++i) {
printf("%lld", A[i]);
putchar(i == (n - 1) ? '\n' : ' ');
}
return 0;
}

  

最新文章

  1. 4.3 多线程进阶篇&lt;中&gt;(GCD)
  2. SQL SERVER与SSIS 数据类型对应关系
  3. browser shell
  4. Python3 连接Mysql
  5. == 与 equals
  6. Hosts文件的使用
  7. php_mysqli面向对象链接数据库(一)
  8. Python一点注意
  9. PDO知识
  10. 回调函数、Java接口回调 总结
  11. C# 中 string.Empty、&quot;&quot;、null的区别
  12. 【转】xcode APP 打包以及提交apple审核详细流程(新版本更新提交审核)
  13. Android服务Service总结
  14. BZOJ 2300: [HAOI2011]防线修建( 动态凸包 )
  15. Linear Regression(线性回归)(三)—代价函数J(θ)选择的概率解释
  16. 《C++ Primer》之面向对象编程(三)
  17. JAVA实现二进制,十六进制输出
  18. js判断密码强度是否符合
  19. T-SQL的进阶:超越基本级别3:构建相关子查询——701小组
  20. my project 中git使用过程(基本操作流程)

热门文章

  1. 创龙DSP6748开发板LED闪烁-第一篇
  2. 虚拟机安装win7 64位-完美解决-费元星
  3. Ruby 基础教程 1-2
  4. possible new indexes 出现了
  5. WebDriver--定位元素的8种方式
  6. sql注入记录------类型转换错误---convert()函数,一句话图片马制作
  7. Navicat 导入sql脚本文件
  8. Python 作用域和命名空间
  9. Oracle-数据库增删改查基本操作
  10. lintcode539 移动零