【HDU5730】 Shell Necklace
HDU5730 Shell Necklace
题目大意
已知连续i(1<=i<=n)个贝壳组合成一段项链的方案数a[i],求组合成包含n个贝壳的项链的总方案数。
Solution
- cdq分治
我们考虑最朴素的\(dp\).
设\(f_i\)表示包含\(i\)个贝壳的方案数,很容易写出转移方程:
\(f_i=\sum_{j=1}^if_{i-j}×a_j\)
发现这个dp方程直接转移是\(O(n^2)\)的,要优化一下....
这个式子不就是分治FFT的式子?
直接cdq不就好了吗?
- 多项式求逆
考虑这个东西怎么求逆对吧.
生成函数构出来直接就可以求式子了...(坑+1)
代码实现
分治FFT
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<iostream>
using namespace std;
#define ll long long
#define re register
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
inline int gi()
{
int f=1,sum=0;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
return f*sum;
}
const int N=1000010,Mod=313;
const double Pi=acos(-1.0);
int a[N],dp[N],n;
struct node
{
double x,y;
node operator+(const node b)const{return (node){x+b.x,y+b.y};}
node operator-(const node b)const{return (node){x-b.x,y-b.y};}
node operator*(const node b)const{return (node){x*b.x-y*b.y,x*b.y+y*b.x};}
}A[N],B[N];
int r[N],limit;
void FFT(node *A,int type)
{
for(int i=0;i<limit;i++)
if(i<r[i])swap(A[i],A[r[i]]);
for(int mid=1;mid<limit;mid<<=1)
{
node Root=(node){cos(Pi/mid),type*sin(Pi/mid)};
for(int R=mid<<1,j=0;j<limit;j+=R)
{
node Mi=(node){1,0};
for(int k=0;k<mid;k++,Mi=Mi*Root)
{
node X=A[j+k],Y=Mi*A[j+mid+k];
A[j+k]=X+Y;
A[j+mid+k]=X-Y;
}
}
}
}
void cdq(int l,int R)
{
if(l==R)
{
dp[l]=(dp[l]+a[l])%Mod;
return;
}
int mid=(l+R)>>1;
cdq(l,mid);
limit=1;int L=0,len=R-l+1;
while(limit<=len)limit<<=1,L++;
for(int i=0;i<limit;i++)
r[i]=(r[i>>1]>>1)|((i&1)<<(L-1));
for(int i=0;i<limit;i++)A[i].x=B[i].x=0,A[i].y=B[i].y=0;
for(int i=l;i<=mid;i++)A[i-l].x=dp[i],A[i].y=0;
for(int j=1;j+l<=R;j++)B[j-1].x=a[j],B[j-1].y=0;
for(int i=mid-l+1;i<=R-l;i++)
A[i].x=0,A[i].y=0;
for(int i=len;i<limit;i++){
A[i].x=0;A[i].y=0;
B[i].x=0;B[i].y=0;
}
FFT(A,1);FFT(B,1);
for(int i=0;i<limit;i++)
A[i]=A[i]*B[i];
FFT(A,-1);
for(int i=0;i<limit;i++)
A[i].x=A[i].x/limit;
for(int i=mid+1;i<=R;i++)
{
dp[i]+=((ll)(A[i-l-1].x+0.5))%313;
dp[i]%=313;
}
cdq(mid+1,R);
}
int main()
{
while(scanf("%d",&n)==1 && n)
{
for(int i=1;i<=n;i++)a[i]=gi()%Mod;
memset(dp,0,sizeof(dp));
cdq(1,n);
printf("%d\n",dp[n]);
}
return 0;
}
多项式求逆
挖坑待补
【HDU5730】 Shell Necklace的更多相关文章
- 【HDU5730】Shell Necklace(多项式运算,分治FFT)
[HDU5730]Shell Necklace(多项式运算,分治FFT) 题面 Vjudge 翻译: 有一个长度为\(n\)的序列 已知给连续的长度为\(i\)的序列装饰的方案数为\(a[i]\) 求 ...
- 【转】shell编程下 特殊变量、test / [ ]判断、循环、脚本排错
[转]shell编程下 特殊变量.test / [ ]判断.循环.脚本排错 第1章 shell中的特殊变量 1.1 $# $# 表示参数的个数 1.1.1 [示例]脚本内容 [root@znix ~] ...
- 【转】Shell编程进阶篇(完结)
[转]Shell编程进阶篇(完结) 1.1 for循环语句 在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行. 它跟其他的循环,如while循环,最 ...
- 【转】Shell编程基础篇-下
[转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...
- 【转】Shell编程基础篇-上
[转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...
- 【Markdown】Shell命令高亮显示
[问题]shell命令,黏贴到简书的代码块上,#后面的命令显示成被注释掉的效果 image.png [目的]高亮显示shell命令 [方案1]在代码块标示符后,加上此代码块所用的语言名(请注意要用小写 ...
- 【原】shell编写一个简单的jmeter自动化压测脚本
在公司做压力测试也挺长时间了,每次测试前环境数据准备都需要话费较长时间,所以一直在考虑能不能将整个过程实现自动化进行,于是就抽空写了一个自动化脚本,当然这个脚本目前功能十分简陋,代码也不完善,很有很多 ...
- 【二分】Shell Pyramid
[来源]:2008年哈尔滨区域赛 [题目链接]: http://acm.hdu.edu.cn/showproblem.php?pid=2446 [题意] 题目是真的长呀,其实就问一个问题. 按照图里面 ...
- 【HDU 5730】Shell Necklace
http://acm.hdu.edu.cn/showproblem.php?pid=5730 分治FFT模板. DP:\(f(i)=\sum\limits_{j=0}^{i-1}f(j)\times ...
随机推荐
- oracle 监视索引是否使用
公司的大数据产品已经升级了四个版本了,最新版本的数据计算,大部分从oracle迁移到hadoop中了. 但是也有客户使用旧版的系统,不过,不去管它.只说我管理的. 在我接过这个数据库管理的时候,发现有 ...
- SQL语句备份和还原数据库
1,使用SQL最简单备份,还原数据库 1 /* 备份 */ 2 backup database Test to disk='D:/Test.bak' 3 /* 还原 */ 4 restore data ...
- c++关键字volatile的作用
1.易变性 1.1概念 编译器对volatile修饰的变量,当要读取这个变量时,任何情况下都会从内存中读取,而不会从寄存器缓存中读取(因为每次都从内存中读取体现出变量的“易变”) 1.2测试代码(VS ...
- 关于xftp上传文件状态错误的解决
新建一个文件夹,/usr/local/wwj 更改wwj权限 chmod 777 wwj 然后就可以上传了 如果还不行,就关闭防火墙
- 振动器(Vibrator)
package com.wwj.serviceandboardcast; import android.app.Activity; import android.app.Service; impo ...
- goole Advance client 离线安装
1.下载插件:Advanced Rest Client 2.最新版的Chrome不支持本地安装插件,所以我们要使能开发者模式 3.把插件后缀名crx改为zip 4.解压,点击‘加载正在开发的扩展程序’ ...
- hadoop hive组件介绍及常用cli命令
Hive架构图 Hive产生原因 1 关系型数据库以产生多年sql成熟 2 简化开发降低成本 3 java成员可编写udf函数 Hive是什么 Hive是基于hadoop的一个数据库工具,使用Hql作 ...
- 怎么让挨着的两input之间没有空隙?
问题:在写选项卡的时候,用input做点击事件的切换时,两个input之间会有空隙,使用margin/padding为0或者为负数依旧如此 → 解决:我脑慢的最后才想到是空格影响的,呵呵呵.
- servlet 解决乱码问题
对于servlet大家应该都很熟悉了,今天再复习一下,如果有哪里写的不好或不对的地点希望广大的网友批评指正.今天只讨论get和post两w种方式,他们之间有很多的不同点,所以解决编码的方式也会不一样, ...
- Arria10中PHY的时钟线结构
发送器时钟网络由发送器PLL到发送器通道,它为发送器提供两种时钟 高速串行时钟——串化器的高速时钟 低速并行时钟——串化器和PCS的低速时钟 在绑定通道模式,串行和并行时钟都是由发送器的PLL提供给发 ...