【HDU 5730】Shell Necklace
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的更多相关文章
- 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 ...
- 【HDU5730】Shell Necklace(多项式运算,分治FFT)
[HDU5730]Shell Necklace(多项式运算,分治FFT) 题面 Vjudge 翻译: 有一个长度为\(n\)的序列 已知给连续的长度为\(i\)的序列装饰的方案数为\(a[i]\) 求 ...
- 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题
[HDU 3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...
- 【HDU 5647】DZY Loves Connecting(树DP)
pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...
- -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】
[把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...
- 【HDU 2196】 Computer(树的直径)
[HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...
- 【HDU 2196】 Computer (树形DP)
[HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...
- 【HDU 5145】 NPY and girls(组合+莫队)
pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...
- 【HDU5730】 Shell Necklace
HDU5730 Shell Necklace 题目大意 已知连续i(1<=i<=n)个贝壳组合成一段项链的方案数a[i],求组合成包含n个贝壳的项链的总方案数. Solution cdq分 ...
随机推荐
- 51nod 1766 树上的最远点对——线段树
n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间,表示点的标号请你求出两个区间内各选一点之间的最大距离,即你需要求出max{dis(i,j) |a<=i<=b,c<=j& ...
- javascript中=、==与===的区别
1.等号 =赋值运算符,给变量赋值 var a="1"; 2.相等和不相等操作符 相等操作符由==表示,若两个操作数相等,则返回true:不相等操作符由!=表示,若两个操作数不相等 ...
- Java的Integer常量池和String常量池
1.Integer的常量池 看下面一段代码: package cn.qlq.test; public class ArrayTest { public static void main(String[ ...
- 【转】gif文件格式详解
1.概述 ~~~~~~~~ GIF(Graphics Interchange Format,图形交换格式)文件是由 CompuServe公司开发的图形文件格式,版权所有,任何商业目的使用均须 Comp ...
- foreign key constraint fails错误的原因
建表:CREATE TABLE Course ( Cno Char(4) PRIMARY KEY, Cname Char(40), Cpno Char(4), Ccredit Int, FOREIGN ...
- python实战===2017年30个惊艳的Python开源项目 (转)
本文转自:http://www.sohu.com/a/216723120_115128 摘要:本文来自Mybridge,介绍了过去一年里30个惊艳的Python开源项目.点击每一个都可以在GitHub ...
- 【洛谷P3651】展翅翱翔之时
难以吐槽出题人的中二病…… 这题有点类似ZJOI2008 骑士,先跑树上的,最后拆环即可. #include<bits/stdc++.h> #define N 100005 typedef ...
- vue点击切换颜色限制个数(用了mui框架)
vue点击切换颜色 只能点击一个 <!doctype html> <head> <meta charset="UTF-8"> <title ...
- [hadoop][会装]zookeeper安装
1.简介 分布式场景下的各个进程间的协调运作离不开zookeeper, zookeeper已经是大数据领域提供分布式协调服务的事实标准. 本文只介绍zookeeper的安装方法. 2. 节点规划如下: ...
- MySQL乐观锁
MySQL悲观锁是依靠数据库的锁机制来实现,以实现最大程度上的独占性.但由于现代的web系统一般都是高并发的,所以悲观锁在这样的情况下的适用性不高,所以我们有了和悲观锁相对应的乐观锁. 乐观锁,是说假 ...