http://acm.hdu.edu.cn/showproblem.php?pid=5730

分治FFT模板。

DP:\(f(i)=\sum\limits_{j=0}^{i-1}f(j)\times a(i-j)\)

递推第i位时要用到0到i-1位,cdq套FFT,考虑每一位上f的贡献即可。

时间复杂度\(O(n\log^2n)\)。

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int N = 200003;
const int p = 313;
double Pi = acos(-1); struct cp {
double r, i;
cp(double _r = 0, double _i = 0) : r(_r), i(_i) {}
cp operator + (const cp &x) {return cp(r + x.r, i + x.i);}
cp operator - (const cp &x) {return cp(r - x.r, i - x.i);}
cp operator * (const cp &x) {return cp(r * x.r - i * x.i, r * x.i + i * x.r);}
} S[N]; void DFT(cp *A, int *rev, int n, int flag) {
for (int i = 0; i < n; ++i) S[rev[i]] = A[i];
for (int i = 0; i < n; ++i) A[i] = S[i];
for (int len = 2; len <= n; len <<= 1) {
int mid = len >> 1; cp wn = cp(cos(Pi / mid), sin(Pi / mid) * flag);
for (int i = 0; i < n; i += len) {
cp w = cp(1, 0);
for (int j = 0; j < mid; ++j) {
cp u = A[i + j], t = A[i + j + mid] * w;
A[i + j] = u + t;
A[i + j + mid] = u - t;
w = w * wn;
}
}
}
if (flag == -1) for (int i = 0; i < n; ++i) A[i].r /= n;
} cp A[N], B[N]; int n, a[N], f[N], rev[N]; void cdq(int l, int r) {
if (l == r) return;
int mid = (l + r) >> 1;
cdq(l, mid); int len = r - l + 1, fn = 1, c0 = 0;
while (fn < len) fn <<= 1, ++c0; for (int i = 0; i < fn; ++i) {
int num = i, &res = rev[i]; res = 0;
for (int j = 0; j < c0; ++j, num >>= 1) {
res <<= 1;
if (num & 1) res |= 1;
}
}
for (int i = l; i <= mid; ++i) A[i - l] = cp(f[i], 0);
for (int i = mid + 1 - l; i < fn; ++i) A[i] = cp(0, 0);
for (int i = 0; i < len; ++i) B[i] = cp(a[i], 0);
for (int i = len; i < fn; ++i) B[i] = cp(0, 0); DFT(A, rev, fn, 1);
DFT(B, rev, fn, 1);
for (int i = 0; i < fn; ++i) A[i] = A[i] * B[i];
DFT(A, rev, fn, -1); for (int i = mid + 1; i <= r; ++i) (f[i] += ((int)(A[i - l].r + 0.5))) %= p;
cdq(mid + 1, r);
} int main() {
while (true) {
scanf("%d", &n); if (!n) break;
memset(a, 0, sizeof(a));
memset(f, 0, sizeof(f));
for (int i = 1; i <= n; ++i) scanf("%d", a + i), a[i] %= p;
f[0] = 1;
cdq(0, n);
printf("%d\n", f[n]);
}
return 0;
}

【HDU 5730】Shell Necklace的更多相关文章

  1. HDU - 5730 :Shell Necklace(CDQ分治+FFT)

    Perhaps the sea‘s definition of a shell is the pearl. However, in my view, a shell necklace with n b ...

  2. 【HDU5730】Shell Necklace(多项式运算,分治FFT)

    [HDU5730]Shell Necklace(多项式运算,分治FFT) 题面 Vjudge 翻译: 有一个长度为\(n\)的序列 已知给连续的长度为\(i\)的序列装饰的方案数为\(a[i]\) 求 ...

  3. 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题

    [HDU  3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...

  4. 【HDU 5647】DZY Loves Connecting(树DP)

    pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...

  5. -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】

    [把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...

  6. 【HDU 2196】 Computer(树的直径)

    [HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...

  7. 【HDU 2196】 Computer (树形DP)

    [HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...

  8. 【HDU 5145】 NPY and girls(组合+莫队)

    pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...

  9. 【HDU5730】 Shell Necklace

    HDU5730 Shell Necklace 题目大意 已知连续i(1<=i<=n)个贝壳组合成一段项链的方案数a[i],求组合成包含n个贝壳的项链的总方案数. Solution cdq分 ...

随机推荐

  1. 【POJ】2947 Widget Factory(高斯消元)

    http://poj.org/problem?id=2947 各种逗啊..还好1a了.. 题意我就不说了,百度一大把. 转换为mod的方程组,即 (x[1,1]*a[1])+(x[1,2]*a[2]) ...

  2. 【51NOD-0】1081 子段求和

    [算法]树状数组(区间和) [题解]记得开long long #include<cstdio> #include<cstring> #include<algorithm& ...

  3. 【BZOJ】1014 [JSOI2008]火星人prefix

    [算法]splay [题解]对于每个结点维护其子树串的hash值,前面为高位,后面为低位. sum[x]=sum[L]*base[s[R]+1]+A[x]*base[s[R]]+sum[R],其中su ...

  4. spring项目中web-inf下不能引用页面资源

    1.spring项目结构 2.spring结构说明 web-inf目录是不对外开放的,外部没办法直接访问到(即通过url访问),只有通过映射来访问,如映射一个action或servlet通过服务器端跳 ...

  5. js函数定义方法

    1.函数声明 其语法为 function functionName(){ //函数体 } 首先是function关键字,然后是函数名,其重要特征是函数声明提升,即在执行代码之前会先读取函数声明,使其在 ...

  6. telnet如何保存输出内容到本地

    telnet如何保存输出内容到本地 http://bbs.csdn.net/topics/391023327 一种将程序的标准输出重定向到telnet终端的方法 http://blog.chinaun ...

  7. HDU 5136 Yue Fei's Battle

    题目链接:HDU-5136 网上的一篇题解非常好,所以就直接转载了.转自oilover的博客 代码: #include<cstring> #include<cstdio> #i ...

  8. SVN使用详解

    一.SVN的使用 项目经理使用,写好项目框架.文档等. 李四(程序员)的使用,在项目经理写好的框架上进行开发. 二.SVN三大指令 Checkout(检出操作): 连接到svn服务器 更新服务器数据到 ...

  9. docker数据管理--数据卷的备份

    /* 先在宿主机创建一个备份的文 件夹, 然后将其以另外一个名字的目录挂载到容器里, 此时不管容器里,或宿主机里做什么操作, 数据都会及时更新,并得到备份. */ [root@localhost ~] ...

  10. div左右自适应高度一致

    <div style="width:300px;"> <div id="Left" style="float:left;" ...