codeforces 632E FFT快速幂优化
来源:互联网 发布:九章算法bat班视频 编辑:程序博客网 时间:2024/06/01 21:35
简略题意:
假若只能取两个物品,就是一个很经典的生成函数问题,相当于做一次多项式乘法,可以用FFT去优化这个过程。现在我们做
复杂度
#include <bits/stdc++.h>using namespace std;typedef long long LL;const LL kMaxn = 4e6;typedef long double ld;const double kPi = acos(-1.0);int len, n;struct Complex { double r, i; Complex(double r = 0, double i = 0):r(r), i(i) {}; Complex operator + (const Complex & rhs) { return Complex(r + rhs.r, i + rhs.i); } Complex operator - (const Complex & rhs) { return Complex(r - rhs.r, i - rhs.i); } Complex operator * (const Complex &rhs) { return Complex(r * rhs.r - i * rhs.i, i * rhs.r + r * rhs.i); }} va[kMaxn], vb[kMaxn];void Rader(Complex F[], int len) { int j = len >> 1; for(int i = 1; i < len - 1; i++) { if(i < j) swap(F[i], F[j]); int k = len >> 1; while(j >= k) { j -= k; k >>= 1; } if(j < k) j += k; }}void FFT(Complex F[], int len, int t) { //时域转频域 Rader(F, len); for(int h = 2; h <= len; h <<= 1) { Complex wn(cos(-t*2*kPi/h), sin(-t*2*kPi/h)); for(int j = 0; j < len; j += h) { Complex E(1, 0); for(int k = j; k < j + h / 2; k++) { Complex u = F[k]; Complex v = E*F[k+h/2]; F[k] = u + v; F[k+h/2] = u - v; E = E * wn; } } } if(t == -1) { for(int i = 0; i < len; i++) { F[i].r /= len; } }}void Init(int *a, int *b, int &v1, int v2) { int n1 = v1, n2 = v2; len = 1; while(len < 2*n1 || len < 2*n2) len <<= 1; int i; for(i = 0; i < n1; i++) va[i].r = a[i], va[i].i = 0; while(i < len) va[i].r = va[i].i = 0, i++; for(i = 0; i < n2; i++) vb[i].r = b[i], vb[i].i = 0; while(i < len) vb[i].r = vb[i].i = 0, i++; v1 += v2;}void Solve(int *a, int *b, int &v1, int v2) { Init(a, b, v1, v2); FFT(va, len, 1); FFT(vb, len, 1); for(int i = 0; i < len; i++) va[i] = va[i] * vb[i]; FFT(va, len, -1); for(int i = 0; i < len; i++) a[i] = (int)(va[i].r + 0.5)?1:0;}int t, k;int res[kMaxn];int a[kMaxn], b[kMaxn];int v1, v2;int main() { scanf("%d%d", &t, &k); for(int i = 1; i <= t; i++) { int v; scanf("%d", &v); a[v]++; v1 = max(v1, v); } v1++; v2 = 1; res[0] = 1; while(k) { if(k & 1) Solve(res, a, v2, v1); k>>=1; Solve(a, a, v1, v1); } for(int i = 0 ; i<= v2; i++) if(res[i]) printf("%d\n", i); return 0;}
阅读全文
0 0
- codeforces 632E FFT快速幂优化
- Codeforces 632E Thief in a Shop(FFT+快速幂)
- codeforces 632E(FFT+分治)
- codeforces 623 E FFT
- CodeForces 632E Thief in a Shop(FFT)
- Codeforces Round #341 (Div. 2)E(矩阵快速幂优化dp,好题)
- Codeforces 514E Darth Vader and Tree【Dp+矩阵快速幂优化】
- Codeforces 514E Darth Vader and Tree【Dp+矩阵快速幂优化】
- Codeforces 623E Transforming Sequence (分治+FFT)
- Codeforces 514E 矩阵快速幂
- codeforces 514E Darth Vader and Tree (dp+快速幂)
- Codeforces 691E Xor-sequences【矩阵快速幂,好题】
- Codeforces 691E Xor-sequences(矩阵快速幂)
- Codeforces 691 E Xor-sequences 矩阵快速幂
- CodeForces-691E Xor-sequences(矩阵快速幂)
- codeforces 691E Xor-sequences(矩阵快速幂)
- codeforces #373(div 2) E (线段树+矩阵快速幂)
- Codeforces 691E Xor-sequences【矩阵快速幂,好题】
- 【PDF下载】金融技术峰会之蚂蚁金服大数据开放式创新实践
- 5G、物联网、光通信谁将撬开2017年通信市场新机遇
- Android之侧滑菜单DrawerLayout的使用
- python打印颜色
- input输入框 只能输入数字,并且保留2位小数
- codeforces 632E FFT快速幂优化
- NB-IoT 与eMTC的十轮鏖战
- can't find referenced class okhttp3.internal.http.HttpEngine错误解决
- 【学习摘记】马士兵Servlet&JSP_课时8-课时10_cookie
- Python MySQLdb executemany的使用和遇到的问题
- BootStrap 模态框禁用空白处点击关闭
- 录音知识整理
- The application may be doing too much work on its main thread.
- Codeforces Round #433 (Div. 2) D. Jury Meeting