hdu 5730(分治FFT)
来源:互联网 发布:小米手环数据修改攻略 编辑:程序博客网 时间:2024/04/27 07:32
dp[i] = sigma(a[j] * dp[i-j]) (j < i);
看这里
#include <bits/stdc++.h>#pragma comment(linker, "/STACK:102400000,102400000")using namespace std;#define LL long long#define pii pair<int,int>#define MP make_pair#define ls i << 1#define rs ls | 1#define md (ll + rr >> 1)#define lson ll, md, ls#define rson md + 1, rr, rs#define Pi acos(-1.0)#define mod 1000000007#define eps 1e-12#define inf 0x3f3f3f3f#define N 200010#define M 1200020struct Complex{ double r, i; Complex(double r = 0, double i = 0) : r(r), i(i) {} Complex operator + (const Complex &b) const { return Complex(r + b.r, i + b.i); } Complex operator - (const Complex &b) const { return Complex(r - b.r, i - b.i); } Complex operator * (const Complex &b) const { return Complex(r * b.r - i * b.i, r * b.i + b.r * i); }};void change(Complex *y, int len){ for(int i = 1, j = len >> 1; i < len - 1; ++i){ if(i < j) swap(y[i], y[j]); int k = len >> 1; while(j >= k) j -= k, k >>= 1; if(j < k) j += k; }}void FFT(Complex *y, int len, int on){ change(y, len); for(int h = 2; h <= len; h <<= 1){ Complex wn = Complex(cos(-on*2*Pi/h), sin(-on*2*Pi/h)); for(int j = 0; j < len; j += h){ Complex w = Complex(1, 0); for(int k = j; k < j + h / 2; ++k){ Complex u = y[k]; Complex t = w * y[k+h/2]; y[k] = u + t; y[k+h/2] = u - t; w = w * wn; } } } if(on == -1){ for(int i = 0; i < len; ++i) y[i].r /= len; }}int dp[N], a[N];Complex x[N<<2], y[N<<2];void solve(int L, int R){ if(L == R) return ; int mid = (L + R) >> 1; solve(L, mid); int len = 1, len1 = R - L + 1; while(len <= len1) len <<= 1; for(int i = 0; i < len1; ++i) x[i] = Complex(a[i], 0); for(int i = len1; i <= len; ++i) x[i] = Complex(0, 0); for(int i = L; i <= mid; ++i) y[i-L] = Complex(dp[i], 0); for(int i = mid - L + 1; i <= len; ++i) y[i] = Complex(0, 0); FFT(x, len, 1); FFT(y, len, 1); for(int i = 0; i < len; ++i) x[i] = x[i] * y[i]; FFT(x, len, -1); for(int i = mid + 1; i <= R; ++i){ dp[i] += x[i-L].r + 0.5; dp[i] %= 313; } solve(mid + 1, R);}int main(){ int n; while(scanf("%d", &n) != EOF && n){ for(int i = 1; i <= n; ++i) scanf("%d", &a[i]), a[i] %= 313; for(int i = 1; i <= n; ++i) dp[i] = 0; dp[0] = 1; solve(0, n); printf("%d\n", dp[n]); } return 0;}
0 0
- hdu 5730(分治FFT)
- HDU 5730 (CDQ分治 FFT)
- HDU 5730 Shell Necklace(FFT+分治)
- hdu 5730 Shell Necklace cdq分治+FFT
- HDU 5730 Shell Necklace(CDQ分治+FFT)
- [HDU 5730] Shell Necklace (FFT+CDQ分治)
- HDU 5730 多校1 Shell Necklace (CDQ分治+FFT)
- HDU 5730 Shell Necklace(dp+cdq分治+FFT优化)
- hdu 5730 Shell Necklace(2016多校第一场)FFT+分治
- HDU 5730 2016多校Contest 1 G题【CDQ分治和FFT模板】
- 树分治+FFT
- BZOJ3456【分治FFT】
- Radix-2 分治FFT
- 【XSY2166】Hope 分治 FFT
- CodeChef PrimeDST【点分治】【FFT】
- BZOJ3451 Normal 点分治+FFT
- CC PRIMEDST(点分治+FFT)
- Hdu 5730 Shell Necklace(cdq+fft)
- LeetCode[368] Largest Divisible Subset
- HDU 1863 畅通工程
- svn1
- java-面试-阿里
- POJ3468(线段树成段增加)
- hdu 5730(分治FFT)
- poj3278 Catch That Cow
- POJ 1258Agri-Net
- [概率dp 矩阵乘法] poj 3744 Scout YYF I
- java-学习-自我规划
- 枚举+求桥 Codeforces701F Break Up
- POJ1995 Raising Modulo Numbers
- Codeforces Round #364 (Div. 2)E.Connecting Universities
- HDU 1052 Tian Ji -- The Horse Racing