HDU 5730 - Shell Necklace
题意:
给出连续的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的更多相关文章
- 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)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5730 [题目大意] 给出一个数组w,表示不同长度的字段的权值,比如w[3]=5表示如果字段长度为3 ...
- hdu 5730 Shell Necklace——多项式求逆+拆系数FFT
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5730 可以用分治FFT.但自己只写了多项式求逆. 和COGS2259几乎很像.设A(x),指数是长度,系数 ...
- 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 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+cdq分治
题目链接 dp[n] = sigma(a[i]*dp[n-i]), 给出a1.....an, 求dp[n]. n为1e5. 这个式子的形式显然是一个卷积, 所以可以用fft来优化一下, 但是这样也是会 ...
- #8 //HDU 5730 Shell Necklace(CDQ分治+FFT)
Description 给出长度分别为1~n的珠子,长度为i的珠子有a[i]种,每种珠子有无限个,问用这些珠子串成长度为n的链有多少种方案 题解: dp[i]表示组合成包含i个贝壳的项链的总方案数 转 ...
- HDU.5730.Shell Necklace(分治FFT)
题目链接 \(Description\) 有\(n\)个长度分别为\(1,2,\ldots,n\)的珠子串,每个有\(a_i\)种,每种个数不限.求有多少种方法组成长度为\(n\)的串.答案对\(31 ...
- hdu Shell Necklace 5730 分治FFT
Description Perhaps the sea‘s definition of a shell is the pearl. However, in my view, a shell neckl ...
随机推荐
- 认识WebSocket理论篇
本文转自http://www.ibm.com/developerworks/cn/java/j-lo-WebSocket/ HTML5作为下一代WEB标准,拥有许多引人注目的新特性,如Canvas.本 ...
- linux下python多版本共存
为何要安装python,linux下不是已经集成了python吗? 大多数linux系统都集成了python,但是他们的版本太低了.不能满足我们的需求,尤其是好多系统居然仍停留在 python2.6. ...
- ubuntu sendmail
一.安装 ubuntu中sendmail函数可以很方便的发送邮件,ubuntu sendmail先要安装两个包. 必需安装的两个包: 代码 sudo apt-get install sendmail ...
- 解决mac ssh连linux中文乱码的问题[转]
将Mac下/etc/ssh_config中的SendEnv LANG LC_*这一行用#号注释掉 reference: http://www.zhihu.com/question/20117388
- 龙邱STM32单片机用J-LINK下载无法被识别的解决方法
问题如下: 按照正常步骤使用keil5给龙邱的stm32下载程序,SWD下载方式提示no cortex-m sw device found,JTAG方式提示no cortex-m device fou ...
- Android中动态更新TextView上的文字
示例代码: 1.新线程,定时更新文字 class testThread extends Thread{ public void run() { Message message = new Messag ...
- Ext.getCmp()的简单使用
Ext.getCmp(Ext组件ID),根据Ext组件的ID选择EXT组件. 例如:点击Panel->toolbar上的button改变Panel的标题 Ext.onReady(function ...
- table列等宽
固定table列等宽 固定table列等宽 style: {table-layout : fixed} html: style="table-layout:fixed" js: o ...
- C# 客户端发送http请求代码 (c/s)
public class RestClient { private string BaseUri; public RestClient(string baseUri) { this.BaseUri = ...
- Arcgis api For silverlight 加载QQ地图
原文 http://www.cnblogs.com/thinkaspx/archive/2012/11/07/2759079.html //本篇博客仅在技术上探讨可行性 //如果要使用Q 地图,请 ...