题目链接

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分治的更多相关文章

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

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5730 [题目大意] 给出一个数组w,表示不同长度的字段的权值,比如w[3]=5表示如果字段长度为3 ...

  2. #8 //HDU 5730 Shell Necklace(CDQ分治+FFT)

    Description 给出长度分别为1~n的珠子,长度为i的珠子有a[i]种,每种珠子有无限个,问用这些珠子串成长度为n的链有多少种方案 题解: dp[i]表示组合成包含i个贝壳的项链的总方案数 转 ...

  3. hdu 5730 Shell Necklace [分治fft | 多项式求逆]

    hdu 5730 Shell Necklace 题意:求递推式\(f_n = \sum_{i=1}^n a_i f_{n-i}\),模313 多么优秀的模板题 可以用分治fft,也可以多项式求逆 分治 ...

  4. 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 ...

  5. HDU 5730 Shell Necklace cdq分治+FFT

    题意:一段长为 i 的项链有 a[i] 种装饰方式,问长度为n的相连共有多少种装饰方式 分析:采用dp做法,dp[i]=∑dp[j]*a[i-j]+a[i],(1<=j<=i-1) 然后对 ...

  6. HDU.5730.Shell Necklace(分治FFT)

    题目链接 \(Description\) 有\(n\)个长度分别为\(1,2,\ldots,n\)的珠子串,每个有\(a_i\)种,每种个数不限.求有多少种方法组成长度为\(n\)的串.答案对\(31 ...

  7. 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] ...

  8. hdu 5730 Shell Necklace——多项式求逆+拆系数FFT

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5730 可以用分治FFT.但自己只写了多项式求逆. 和COGS2259几乎很像.设A(x),指数是长度,系数 ...

  9. HDU 5730 - Shell Necklace

    题意: 给出连续的1-n个珠子的涂色方法 a[i](1<=i<=n), 问长度为n的珠链共有多少种涂色方案 分析: 可以得到DP方程: DP[n] = ∑(i=1,n) (DP[n-i]* ...

随机推荐

  1. oracle权限的分配

    一.创建 sys:   //系统管理员,拥有最高权限 system://本地管理员,次高权限 scott: //普通用户,密码默认为tiger,默认未解锁 二.登陆 sqlplus / as sysd ...

  2. 利用Oracle数据库的UTL_SMTP发送HTML 邮件

    Ok, that looks hard, but if you use this procedure I wrote, its really quite easy, it does all of th ...

  3. Hql参数占位符使用(转+整理)

    在Hibernate 4版本中,对于Hql有一点点改变,如果你还是按照以前的方式去编写HQL Query query = sessionFactory.openSession().createQuer ...

  4. [Linked List]Rotate List

    Total Accepted: 55428 Total Submissions: 250727 Difficulty: Medium Given a list, rotate the list to ...

  5. putty修改编码

    在窗口标题上点击右键,选择 Change Settings... 在打开的配置窗口左边选择 Appearance,在右边点 Font settings 里面的 Change 按钮,选择好中文字体,比如 ...

  6. Android 原生listview item伸展收缩效果 (续)

    接上一个原生的listview item的伸展收缩效果. 上一个可能做的有些粗糙,效果也没有这个好,上代码. package com.example.listviewdemo; import java ...

  7. setTimeout的若干坑

    第一坑:作用域 首先,有一个关于this的面试题,是这样的: var fullname = 'John Doe'; var obj = { fullname: 'Colin Ihrig', prop: ...

  8. Android之 compileSdkVersion, minSdkVersion, and targetSdkVersion

    在一年之中,也有可能只是几个月后,你会发布你的Android应用程序.但是这中间有可能会发布新的版本的Android系统,比如:6.0+. 你肯定希望你的应用可以向前兼容,当用户升级到新的Androi ...

  9. requireJS到底是什么?

    1.requireJS是让js代码模块化:而且js之间的依赖关系,不再依靠script标签的顺序,可以加载不阻塞 2.requireJS加载js的方法:<script data-main=&qu ...

  10. pycharm Run/Debug Configrations

    操作系统是win10,今天维护scrapy爬虫的时候发现pycharm调试配置失效了,导致花了好大力气去搜索配置的路径.在这儿记录下来方便以后查看. Script:C:\Python27\Lib\si ...