#8 //HDU 5730 Shell Necklace(CDQ分治+FFT)
Description
给出长度分别为1~n的珠子,长度为i的珠子有a[i]种,每种珠子有无限个,问用这些珠子串成长度为n的链有多少种方案
题解:
- dp[i]表示组合成包含i个贝壳的项链的总方案数
- 转移:dp[i]=Σdp[i-j]*a[j](1<=j<=i)
#include <bits/stdc++.h>
using namespace std;
#define dob complex<double>
#define rint register int
#define mo 313
#define IL inline
const double pi=acos(-1.0);
const int N=2e5;
dob a[N],b[N],bb[N];
int n,m,r[N],l,dp[N],sum[N];
IL void fft(dob *a,int o)
{
for (rint i=;i<n;i++)
if (i>r[i]) swap(a[i],a[r[i]]);
for (rint i=;i<n;i*=)
{
dob wn(cos(pi/i),sin(pi*o/i)),x,y;
for (rint j=;j<n;j+=(i*))
{
dob w(,);
for (rint k=;k<i;k++,w*=wn)
{
x=a[j+k],y=w*a[i+j+k];
a[j+k]=x+y,a[i+j+k]=x-y;
}
}
}
}
IL void query()
{
l=;
for (n=;n<=m;n<<=) l++;
for (rint i=;i<n;i++) r[i]=(r[i/]/)|((i&)<<(l-));
fft(a,); fft(b,);
for (rint i=;i<n;i++) a[i]*=b[i];
fft(a,-);
for (rint i=;i<=m;i++)
sum[i]=a[i].real()/n+0.5,sum[i]%=mo;
}
#define mid (l+r)/2
void cdq(int l,int r)
{
if (l==r) return;
cdq(l,mid);
for (rint i=l;i<=mid;i++) a[i-l]=dp[i];
m=r-l;
rint x;
for (x=;x<=m;x<<=);
for (rint i=mid+;i<=l+x;i++) a[i-l]=;
b[]=;
for (rint i=;i<=x;i++) b[i]=bb[i];
query();
for (rint i=mid-l+;i<=r-l;i++)
{
dp[i+l]+=sum[i];
dp[i+l]%=mo;
}
cdq(mid+,r);
}
int main()
{
freopen("noi.in","r",stdin);
freopen("noi.out","w",stdout);
std::ios::sync_with_stdio(false);
int k;
while (cin>>k&&k)
{
for (rint i=;i<=k;i++) cin>>bb[i];
memset(dp,,sizeof(dp));
dp[]=;
cdq(,k);
cout<<dp[k]%mo<<endl;
}
return ;
}
该改一个fft模板了,实在是慢https://www.luogu.org/record/show?rid=3767323
#8 //HDU 5730 Shell Necklace(CDQ分治+FFT)的更多相关文章
- 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 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 ...
- 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] ...
随机推荐
- C# Winform继承窗体打开设计器白屏的一例解决方法
环境VS2017 15.5.4,Win10开发过程中,发现一些窗体打开设计器会卡死白屏,另外有一些不会,(两者运行时正常),最小化vs后甚至能把工具箱连带搞黑,严重影响开发效率,经过一天多的对比研究, ...
- CSS之清除浮动(span/clearfix)
一.问题描述 web网页设计中,在div元素中有时候常伴有图文结合的post组件.为了使得文本在图像周围环绕,那么需要对图像区域使用float浮动.如果不做清除浮动,则会出现如下结果: 图像比文本高, ...
- Python人工智能之路 - 第四篇 : jieba gensim 最好别分家之最简单的相似度实现
简单的问答已经实现了,那么问题也跟着出现了,我不能确定问题一定是"你叫什么名字",也有可能是"你是谁","你叫啥"之类的,这就引出了人工智能 ...
- String split方法与Guava Splitter用法区别
String split方法与Guava Splitter用法区别 今天同事写了一段使用String split方法的代码,如下所示,同事期望得到的是字符"1",但是没想到却得到空 ...
- mysql 原理 ~ double write
一 简介:今天来聊聊double write 二 细节 1 Double write 是InnoDB在 tablespace(ibdata1)上的128个页(2个区)是2MB: 2 何谓页断裂 所谓页 ...
- 课程4:黑马程序员_spring2.5视频教程--视频列表
\黑马程序员_spring2.5视频教程\01Struts相关基础理论介绍.mp4; \黑马程序员_spring2.5视频教程\02搭建struts开发环境.mp4; \黑马程序员_spring2.5 ...
- 深层揭密extern "C"
一. extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的:其次,被它修饰的目标是“C”的.让我们来详细解读这两重含义. (1) 被ext ...
- jQuery中对未来的元素绑定事件用bind、live or on
对未来的元素绑定事件不能用bind, 1.可以用live代替,但是要注意jquery的版本,根据官方文档,从1.7开始就不推荐live和delegate了,1.9里就去掉live了. 2.推荐用on代 ...
- python 退出程序的方式
python程序退出方式[sys.exit() os._exit() os.kill() os.popen(...)] 知乎说明 http://www.zhihu.com/question/21187 ...
- python中 __name__及__main()__的妙处
python中 __name__及__main()__的妙处 #hello.pydef sayHello(): str="hello" print(str); if __name_ ...