hdu 5730 Shell Necklace fft+cdq分治
dp[n] = sigma(a[i]*dp[n-i]), 给出a1.....an, 求dp[n]。 n为1e5.
这个式子的形式显然是一个卷积, 所以可以用fft来优化一下, 但是这样也是会超时的。 所以可以用cdq分治来优化。
cdq分治就是处理(l, mid)的时候, 将dp[l]...dp[mid]对dp[mid+1]...dp[r]做的贡献都算出来。
#include <bits/stdc++.h> using namespace std;
#define pb(x) push_back(x)
#define ll long long
#define mk(x, y) make_pair(x, y)
#define lson l, m, rt<<1
#define mem(a) memset(a, 0, sizeof(a))
#define rson m+1, r, rt<<11
#define mem1(a) memset(a, -1, sizeof(a))
#define mem2(a) memset(a, 0x3f, sizeof(a))
#define rep(i, n, a) for(int i = a; i<n; i++)
#define fi first
#define se second
typedef pair<int, int> pll;
const double PI = acos(-1.0);
const double eps = 1e-;
const int mod = 1e9+;
const int inf = ;
const int dir[][] = { {-, }, {, }, {, -}, {, } };
typedef complex <double> cmx;
const int maxn = 2e5;
cmx x[maxn], y[maxn];
int a[maxn], dp[maxn], n;
void change(cmx x[], int len) {
int i, j, k;
for(i = , j = len/; i < len - ; i++) {
if(i < j)
swap(x[i], x[j]);
k = len / ;
while(j >= k) {
j -= k;
k /= ;
}
if(j < k)
j += k;
}
}
void fft(cmx x[], int len, int on) {
change(x, len);
for(int i = ; i <= len; i <<= ) {
cmx wn(cos(-on * * PI/i), sin(-on * * PI/i));
for(int j = ; j < len; j += i) {
cmx w(, );
for(int k = j; k < j + i/; k++) {
cmx u = x[k];
cmx v = x[k + i/]*w;
x[k] = u + v;
x[k+i/] = u - v;
w *= wn;
}
}
}
if(on == -) {
for(int i = ; i < len; i++)
x[i] /= len;
}
}
void cdq(int l, int r)
{
if(l == r) {
dp[l] += a[l];
dp[l] %= mod;
return ;
}
int mid = l+r>>;
cdq(l, mid);
int len = ;
while(len <= (r-l+))
len <<= ;
for(int i = ; i < len; i++) {
x[i] = y[i] = cmx(, );
}
for(int i = l; i <= mid; i++) {
x[i-l] = cmx(dp[i], );
}
for(int i = ; i <= r-l; i++) {
y[i-] = cmx(a[i], );
}
fft(x, len, );
fft(y, len, );
for(int i = ; i < len; i++)
x[i] *= y[i];
fft(x, len, -);
for(int i = mid+; i <= r; i++) {
dp[i] += (int)(x[i-l-].real()+0.5);
dp[i] %= mod;
}
cdq(mid+, r);
}
int main()
{
while(scanf("%d", &n) && n) {
mem(dp);
for(int i = ; i <= n; i++) {
scanf("%d", &a[i]);
a[i] %= mod;
}
cdq(, n);
cout<<dp[n]<<endl;
}
}
hdu 5730 Shell Necklace fft+cdq分治的更多相关文章
- HDU 5730 Shell Necklace(CDQ分治+FFT)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5730 [题目大意] 给出一个数组w,表示不同长度的字段的权值,比如w[3]=5表示如果字段长度为3 ...
- #8 //HDU 5730 Shell Necklace(CDQ分治+FFT)
Description 给出长度分别为1~n的珠子,长度为i的珠子有a[i]种,每种珠子有无限个,问用这些珠子串成长度为n的链有多少种方案 题解: dp[i]表示组合成包含i个贝壳的项链的总方案数 转 ...
- hdu 5730 Shell Necklace [分治fft | 多项式求逆]
hdu 5730 Shell Necklace 题意:求递推式\(f_n = \sum_{i=1}^n a_i f_{n-i}\),模313 多么优秀的模板题 可以用分治fft,也可以多项式求逆 分治 ...
- 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 ...
- HDU 5730 Shell Necklace cdq分治+FFT
题意:一段长为 i 的项链有 a[i] 种装饰方式,问长度为n的相连共有多少种装饰方式 分析:采用dp做法,dp[i]=∑dp[j]*a[i-j]+a[i],(1<=j<=i-1) 然后对 ...
- HDU.5730.Shell Necklace(分治FFT)
题目链接 \(Description\) 有\(n\)个长度分别为\(1,2,\ldots,n\)的珠子串,每个有\(a_i\)种,每种个数不限.求有多少种方法组成长度为\(n\)的串.答案对\(31 ...
- hdu 5730 Shell Necklace —— 分治FFT
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5730 DP式:\( f[i] = \sum\limits_{j=1}^{i} f[i-j] * a[j] ...
- hdu 5730 Shell Necklace——多项式求逆+拆系数FFT
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5730 可以用分治FFT.但自己只写了多项式求逆. 和COGS2259几乎很像.设A(x),指数是长度,系数 ...
- HDU 5730 - Shell Necklace
题意: 给出连续的1-n个珠子的涂色方法 a[i](1<=i<=n), 问长度为n的珠链共有多少种涂色方案 分析: 可以得到DP方程: DP[n] = ∑(i=1,n) (DP[n-i]* ...
随机推荐
- zookeeper_02:zookeeper基础
ZooKeeper基础概述 ZooKeeper维护一个小型的数据节点,这些节点被称为znode,采用类似于文件系统的层级树状结构进行管理. 针对一个znode,没有数据常常表达了重要的信息.比如,在主 ...
- 【11.2noip冲刺赛】 循环整数 (分段打表)
[问题描述]moreD在学习完循环小数之后发现循环是个很美好的性质.自己只需要记住短短的循环节以及循环次数(次数大于1,且是整数)就可以记住整个数字了.因为背诵数字变得方便了,moreD决定背诵[L, ...
- MySQL取得当前时间的函数是什么 格式化日期的函数是什么
取得当前时间用 now() 就行.在数据库中格式化时间 用DATE_FORMA T(date, format) .根据格式串format 格式化日期或日期和时间值date,返回结果串. 可用DATE_ ...
- Git客户端使用
1.下载安装包 git: https://git-for-windows.github.io/index.html tortoisegit: https://download.tortoisegit ...
- VS2015中使用Git
10分钟学会在VS2015中使用Git 写程序必然需要版本控制,哪怕是个人项目也是必须的.我们在开发UWP APP的时候,VS2015默认提供了对微软TFS和Git的支持.考虑到现在Git很火,作为微 ...
- python 网络编程第四版
使用SocketServer 模块来完成服务端编程 1.服务端代码如下: #!/usr/bin/python #!coding:utf-8 import SocketServer as sockets ...
- .Net缓存
近期研究了一下.Net的缓存,据说可以提高系统的性能. .Net缓存分为两种HttpRuntime.Cache和HttpContext.Current.Cache 不过从网上查找资料,说两种缓存其实是 ...
- hibernate的3种状态
hibernate的三种状态是瞬态.持久态.脱管态 瞬态:新new来的对象称为瞬态. 持久态:处于该状态的对象在数据库中有一条对应的记录,并拥有一个持久标识. 脱管态:当与某持久对象的session关 ...
- linux下监视进程 崩溃挂掉后自动重启的shell脚本
如何保证服务一直运行?如何保证即使服务挂掉了也能自动重启?在写服务程序时经常会碰到这样的问题.在Linux系统中,强大的shell就可以很灵活的处理这样的事务. 下面的shell通过一个while-d ...
- Struts2 一、 视图转发跳转
<struts> <constant name="struts.118n.encoding" value="UTF-8"></co ...