题意:

  给出连续的1-n个珠子的涂色方法 a[i](1<=i<=n), 问长度为n的珠链共有多少种涂色方案

分析:

  可以得到DP方程: DP[n] = ∑(i=1,n) (DP[n-i]*a[i]).

  该方程为卷积形式,故 CDQ + FFT

  

  CDQ: 将 [l,r] 二分, 先得到[l,mid]的答案,再更新[l,mid]对[mid+1,r]的贡献.

       对任意 DP[j](mid+1 <= j <= r), [l,mid] 对其贡献为 ∑(i=l,mid) (DP[i]*a[j - i]) , 即多项式 DP 与 a 相乘后次数为j项.

  FFT: 优化多项式相乘.

(1 和 l 看不清的也就这破博客园了,代码还是粘下来的好,= =)

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const double PI = * atan(1.0);
const int MAXN = ;
const int MOD = ;
struct Complex
{
double x, y;
Complex(double xx = 0.0, double yy = 0.0) : x(xx), y(yy) {}
Complex operator - (const Complex &b) const
{
return Complex(x - b.x, y - b.y);
}
Complex operator + (const Complex &b) const
{
return Complex(x + b.x, y + b.y);
}
Complex operator * (const Complex &b) const
{
return Complex(x*b.x - y*b.y, x*b.y + y*b.x);
}
};
void Change(Complex y[], int len)
{
int i, j, k;
for (i = , j = len/; i < len-; i++)
{
if (i < j) swap(y[i], y[j]);
k = len / ;
while (j >= k)
{
j -= k;
k /= ;
}
if (j < k) j += k;
}
}
void FFT(Complex y[], int len,int on)
{
Change(y, len);
for (int h = ; h <= len; h <<= )
{
Complex wn( cos(-on**PI/h), sin(-on**PI/h) );
for (int j = ; j < len; j +=h)
{
Complex w(, );
for (int k = j; k < j + h/; k++)
{
Complex u = y[k];
Complex t = w * y[k + h/];
y[k] = u + t;
y[k + h/] = u - t;
w = w * wn;
}
}
}
if (on == -)
for (int i = ; i < len; i++)
y[i].x /= len;
}
int t, n;
Complex x[MAXN], y[MAXN];
int a[MAXN/], dp[MAXN/];
void CDQ(int l, int r)
{
if (l == r) { dp[l] = (dp[l] + a[l]) % MOD; return; }
int mid = (l + r) >> ;
CDQ(l, mid);//处理前半段
int len = , len1 = mid - l + , len2 = r - l + ;
while(len < len2) len <<= ;
for (int i = ; i < len1; i++) x[i] = Complex(dp[i + l], );
for (int i = len1; i < len; i++) x[i] = Complex(, );
for (int i = ; i < len2; i++) y[i] = Complex(a[i], );
for (int i = len2; i < len; i++) y[i] = Complex(, );
FFT(x, len, );
FFT(y, len, );
for (int i = ; i < len; i++) x[i] = x[i] *y[i];
FFT(x, len, -);
for (int i = mid+; i <= r; i++)//更新贡献
{
dp[i] = (int)(dp[i] + x[i - l].x + 0.5) %MOD;
}
CDQ(mid + , r);//处理后半段
}
int main()
{
while(~scanf("%d",&n) && n)
{
for (int i = ; i <= n; i++)
{
scanf("%d",&a[i]);
a[i] %= MOD;
dp[i] = ;
}
CDQ(, n);
printf("%d\n", dp[n]);
}
}

HDU 5730 - Shell Necklace的更多相关文章

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

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

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

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

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

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

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

  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+cdq分治

    题目链接 dp[n] = sigma(a[i]*dp[n-i]), 给出a1.....an, 求dp[n]. n为1e5. 这个式子的形式显然是一个卷积, 所以可以用fft来优化一下, 但是这样也是会 ...

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

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

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

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

  9. hdu Shell Necklace 5730 分治FFT

    Description Perhaps the sea‘s definition of a shell is the pearl. However, in my view, a shell neckl ...

随机推荐

  1. sqlserver 执行远程数据库代码

    1.启用Ad Hoc Distributed Queries: exec sp_configure 'show advanced options',1reconfigureexec sp_config ...

  2. IT学习方法

    IT 技术的发展日新月异,新技术层出不穷,具有良好的学习能力,能及时获取新知识.随时补充和丰富自己,已成为程序员职业发展的核心竞争力.本文中,作者结合多年的学习经验总结出了提高程序员学习能力的三个要点 ...

  3. 1.想写一些关于c++的东西了,就作为个开篇吧

    又再一次重拾c++,想写一些东西,给自己看看,不想再看一些隐晦翻译的外国书籍了,就从一本好读的书开始写一写. 就这本吧, <我的第一本C++书>> 来写一写自己的东西.

  4. 内存管理pbuf.h头文件源码解析——LwIP学习

    声明:个人所写所有博客均为自己在学习中的记录与感想,或为在学习中总结他人学习成果,但因本人才疏学浅,如果大家在阅读过程中发现错误,欢迎大家指正. LwIP的内核(core文件夹)文件中pbuf.c是包 ...

  5. 如何在jQuery中使用 setInterval,setTimeout

    当遇到setInterval,setTimeout与jquery混用的问题 时,直接按JavaScript中的语法写并不起作用,有以下两种解决方法. 方法1. 直接在ready中调用其他方法,会提示缺 ...

  6. eclipse 使用mvn模块化开发

    1.创建maven父工程步骤:new-->other-->选择maven project-->next-->勾选create a simple project-->nex ...

  7. HTML骨架-深入理解

    HTML是WEB开发最基本的语言之一,也是最重要的语言之一,我们在浏览网页时做看到的内容是最直接的呈现形式就是HTML代码.<!DOCTYPE html PUBLIC "-//W3C/ ...

  8. 【Xamarin挖墙脚系列:关闭 OS X El Capitan 中 SIP 安全设置功能】

    比如需要修改内核配置文件: com.apple.Boot.plist 那么我们需要解锁权限. 禁止SIP模式,那么就可以修改此文件了. 在 OS X El Capitan 中有一个跟安全相关的模式叫 ...

  9. SQL数据转移

    方法一:如果想把数据库A中的表Table1中的数据复制到数据库B中的表Table2中,也就是要预先建立Table2,可以使用一下语句: use B goinsert into Table2 selec ...

  10. 【剑指offer】面试题22:栈的压入、弹出序列

    题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列 ...