HDU 5730 Shell Necklace cdq分治+FFT
题意:一段长为 i 的项链有 a[i] 种装饰方式,问长度为n的相连共有多少种装饰方式
分析:采用dp做法,dp[i]=∑dp[j]*a[i-j]+a[i],(1<=j<=i-1)
然后对于这种递推式,也就是dp[i]等于前j个dp数组和a数组的卷积,然后可看所有的
一看n是1e5,所以暴力超时,然后采用cdq分治加速,这种卷积递推通常采用cdq分治加速
cdq的话很简单了,就是先递归左边,算左对右的贡献,递归右边就行,一半一半更新
#include <cstdio>
#include <vector>
#include <stack>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5+;
const int mod = ;
typedef long long LL;
const double pi = acos(-1.0);
int a[N],dp[N],n;
struct complex{
double r,i;
complex(double R=,double I=){
r=R;i=I;
}
complex operator+(const complex &a)const{
return complex(r+a.r,i+a.i);
}
complex operator-(const complex &a)const{
return complex(r-a.r,i-a.i);
}
complex operator*(const complex &a)const{
return complex(r*a.r-i*a.i,r*a.i+i*a.r);
}
}x[N*],y[N*];
void change(complex 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(complex x[],int len,int on){
change(x,len);
for(int i=;i<=len;i<<=){
complex wn(cos(-on**pi/i),sin(-on**pi/i));
for(int j=;j<len;j+=i){
complex w(,);
for(int k=j;k<j+i/;++k){
complex u = x[k];
complex t = w*x[k+i/];
x[k]=u+t;
x[k+i/]=u-t;
w=w*wn;
}
}
}
if(on==-)for(int i=;i<len;++i)x[i].r/=len;
}
void up(int &x){
x%=mod;
}
void cdq(int l,int r){
if(l==r){dp[l]+=a[l];up(dp[l]);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]=complex(,);
for(int i=l;i<=mid;++i)x[i-l]=complex(dp[i],);
for(int i=;i<=r-l+;++i)y[i-]=complex(a[i],);
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)(x[i-l-].r+0.5),up(dp[i]);
cdq(mid+,r);
}
int main(){
while(~scanf("%d",&n),n){
for(int i=;i<=n;++i){
scanf("%d",&a[i]);up(a[i]);dp[i]=;
}
cdq(,n);
printf("%d\n",dp[n]);
}
return ;
}
HDU 5730 Shell Necklace cdq分治+FFT的更多相关文章
- HDU Shell Necklace CDQ分治+FFT
Shell Necklace Problem Description Perhaps the sea‘s definition of a shell is the pearl. However, in ...
- 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+cdq分治
题目链接 dp[n] = sigma(a[i]*dp[n-i]), 给出a1.....an, 求dp[n]. n为1e5. 这个式子的形式显然是一个卷积, 所以可以用fft来优化一下, 但是这样也是会 ...
- 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 可以用分治FFT.但自己只写了多项式求逆. 和COGS2259几乎很像.设A(x),指数是长度,系数 ...
- hdu5730 Shell Necklace 【分治fft】
题目 简述: 有一段长度为n的贝壳,将其划分为若干段,给出划分为每种长度的方案数,问有多少种划分方案 题解 设\(f[i]\)表示长度为\(i\)时的方案数 不难得dp方程: \[f[i] = \su ...
- #8 //HDU 5730 Shell Necklace(CDQ分治+FFT)
Description 给出长度分别为1~n的珠子,长度为i的珠子有a[i]种,每种珠子有无限个,问用这些珠子串成长度为n的链有多少种方案 题解: dp[i]表示组合成包含i个贝壳的项链的总方案数 转 ...
- 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] ...
随机推荐
- REST_FRAMEWORK加深记忆-极致抽象,极致完结
余下的就是静心看官方文档了. 这个是最抽象的了. urls.py """tutorial URL Configuration The `urlpatterns` list ...
- 李洪强iOS开发之initWithFrame,initWithCoder和aweakFormNib
1 initWithFrame 通过代码创建控件的话用这个方法设置 2 initWithCoder(先执行) 与从xib加载有关系的 在此方法里面设置原有子控件的值是不行的,因为还没有连好线 3 ...
- Makefile笔记
一个简单的Makefile描述规则组成: TARGET...:PREREQUISITES... COMMANDS... ... target:规则的目标.通常是程序中间或者最后要生成的文件名,也可以是 ...
- Invoke与BeginInvoke
一.为什么 Control类提供了 Invoke和 BeginInvoke机制? 关于这个问题的最主要的原因已经是 dotnet程序员众所周知的,我在此费点笔墨再次记录到自己的日志,以便日后提醒一下自 ...
- 转Struts 权限控制
权限最核心的是业务逻辑,具体用什么技术来实现就简单得多. 通常:用户与角色建立多对多关系,角色与业务模块构成多对多关系,权限管理在后者关系中. 对权限的拦截,如果系统请求量大,可以用Struts2拦截 ...
- mysql shell
mysql 查询10分钟以内的数据:select *from t_agent where int_last_login>=CURRENT_TIMESTAMP - INTERVAL 10 MINU ...
- poj2454
我不会告诉你我对我自己的想法笑了一下午的.. #include <iostream> #include <algorithm> #include <time.h> ...
- Linux 删除文件夹和创建文件的命令
删除文件夹实例:rm -rf /var/log/httpd/access将会删除/var/log/httpd/access目录以及其下所有文件.文件夹 删除文件使用实例: rm -f /var/log ...
- 进程控制的一些api
转自:http://blog.chinaunix.net/uid-26833883-id-3222794.html 1.fork() ,vfork() 创建进程 2‘ exec()类 在进程中执行其他 ...
- JPA和Hibernate的区别
JPA Java Persistence API,是Java EE 5的标准ORM接口,也是ejb3规范的一部分. Hibernate,当今很流行的ORM框架,是JPA的一个实现,但是其功能是JPA的 ...