博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[SOJ #48]集合对称差卷积
阅读量:6936 次
发布时间:2019-06-27

本文共 1087 字,大约阅读时间需要 3 分钟。

题目大意:给你两个多项式$A,B$,求多项式$C$使得:

$$
C_n=\sum\limits_{x\oplus y=n}A_xB_y
$$
题解:$FWT$
卡点:
C++ Code:

#include 
#include
namespace __IO { int ch; inline int read() { while (isspace(ch = getchar())) ; return ch & 15; }}using __IO::read;#define maxn 2097152int lim;inline void init(const int n) { lim = 1; while (lim < n) lim <<= 1;}inline void FWT(long long *A, const int op = 1) { for (register int mid = 1; mid < lim; mid <<= 1) for (register int i = 0; i < lim; i += mid << 1) for (register int j = 0; j < mid; ++j) { const long long X = A[i + j], Y = A[i + j + mid]; A[i + j] = X + Y, A[i + j + mid] = X - Y; } if (!op) for (long long *i = A; i != A + lim; ++i) *i /= lim;}int n;long long A[maxn], B[maxn];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 + n); FWT(A), FWT(B); for (int i = 0; i < lim; ++i) A[i] = A[i] * B[i]; FWT(A, 0); for (int i = 0; i < n; ++i) printf("%lld ", A[i]); puts(""); return 0;}

 

转载于:https://www.cnblogs.com/Memory-of-winter/p/10267158.html

你可能感兴趣的文章