Shell Necklace (dp递推改cdq分治 + fft)
首先读出题意,然后发现这是一道DP,我们可以获得递推式为

然后就知道,不行啊,时间复杂度为O(n2),然后又可以根据递推式看出这里面可以拆解成多项式乘法,但是即使用了fft,我们还需要做n次多项式乘法,时间复杂度又变成O(n2 * log n),显然不可以。然后又利用c分治思维吧问题进行拆分问题但是,前面求出来的结果对后面的结果会产生影响,所以我们使用cdq分治思想来解决这个问题,时间复杂度变为O(n * log2n)。
#include<bits/stdc++.h>
using namespace std; const double pi = acos(-1.0);
const int mod = ;
const int maxn = 4e5 + ;
int in[maxn], dp[maxn]; struct Complex{
double r,i;
Complex(double r = 0.0, double i = 0.0):r(r),i(i){};
Complex operator+(const Complex &rhs){
return Complex(r + rhs.r, i + rhs.i);
}
Complex operator-(const Complex &rhs){
return Complex(r - rhs.r, i - rhs.i);
}
Complex operator*(const Complex & rhs){
return Complex(r*rhs.r - i*rhs.i, i*rhs.r + r * rhs.i);
}
}x1[maxn],x2[maxn]; void rader(Complex *F, int len){
int j = len >> ;
for(int i = , j = len/; i < len - ; i ++){
if(i < j)swap(F[i], F[j]);
int k = len / ;
while(j >= k){
j -= k; k /= ;
}
if(j < k) j += k;
}
} void FFT(Complex *F, int len, int t){
rader(F, len);
for(int h = ; h <= len; h <<= ){
Complex wn(cos(-t**pi/h), sin(-t**pi/h));
for(int j = ; j < len; j += h){
Complex E(, );
for(int k = j; k < j + h/; k ++){
Complex u = F[k];
Complex v = E * F[k + h/];
F[k] = u + v;
F[k + h/] = u - v;
E = E * wn;
}
}
}
if(t == -)
for(int i = ; i < len; i ++)
F[i].r /= len;
} void cdq(int l, int r){
if(l == r){
dp[l] = (in[l]+dp[l])%mod;
return ;
}
int m = l + r>>;
cdq(l,m);
int len1 = r - l + ;
int len2 = m - l + ;
int len = ;while(len < (len1 + len2)) len <<= ;
for(int i = ; i < len; i ++) x1[i] = x2[i] = Complex(,);
for(int i = ; i < len2; i ++) x1[i] = Complex(dp[i + l], );
for(int i = ; i < len1; i ++) x2[i] = Complex(in[i], );
FFT(x1, len, );FFT(x2, len, ); for(int i = ; i < len; i ++) x1[i] = x1[i] * x2[i];
FFT(x1, len, -);
for(int i = m + ; i <= r; i ++) dp[i] = (dp[i] + (int)(x1[i - l].r + 0.5)) % mod;
cdq(m + , r);
} int main(){
int n;
while(~scanf("%d",&n), n){
for(int i = ; i <= n; i ++){
scanf("%d",&in[i]);
in[i] %= mod;
}
memset(dp, , sizeof(dp));
cdq(, n);
printf("%d\n", dp[n] % mod);
for(int i = ; i <= n; i ++)printf("%d ",dp[i]);printf("\n");
}
return ;
}
Shell Necklace (dp递推改cdq分治 + fft)的更多相关文章
- HDU - 5730 :Shell Necklace(CDQ分治+FFT)
Perhaps the sea‘s definition of a shell is the pearl. However, in my view, a shell necklace with n b ...
- hdu2089(数位DP 递推形式)
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 【BZOJ3456】轩辕朗的城市规划 无向连通图计数 CDQ分治 FFT 多项式求逆 多项式ln
题解 分治FFT 设\(f_i\)为\(i\)个点组成的无向图个数,\(g_i\)为\(i\)个点组成的无向连通图个数 经过简单的推导(枚举\(1\)所在的连通块大小),有: \[ f_i=2^{\f ...
- [BZOJ 3456]城市规划(cdq分治+FFT)
[BZOJ 3456]城市规划(cdq分治+FFT) 题面 求有标号n个点无向连通图数目. 分析 设\(f(i)\)表示\(i\)个点组成的无向连通图数量,\(g(i)\)表示\(i\)个点的图的数量 ...
- HDU5730 Shell Necklace(DP + CDQ分治 + FFT)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5730 Description Perhaps the sea‘s definition of ...
- 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(CDQ分治+FFT)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5730 [题目大意] 给出一个数组w,表示不同长度的字段的权值,比如w[3]=5表示如果字段长度为3 ...
- #8 //HDU 5730 Shell Necklace(CDQ分治+FFT)
Description 给出长度分别为1~n的珠子,长度为i的珠子有a[i]种,每种珠子有无限个,问用这些珠子串成长度为n的链有多少种方案 题解: dp[i]表示组合成包含i个贝壳的项链的总方案数 转 ...
随机推荐
- mybatis获取批量插入的主键自增id
一.写一个实体类 public class UserInfo { private long userId; private String userAccount; private String use ...
- java 线程 (三)线程并发的安全性 同步代码块
package cn.sasa.demo1; import java.util.concurrent.ExecutionException; public class ThreadDemo { pub ...
- 如何进行Django单元测试
如何进行Django单元测试 Django的单元测试使用python的unittest模块,这个模块使用基于类的方法来定义测试.类名为django.test.TestCase,继承于python的un ...
- vscode 使用iView时标签报错 Parsing error: x-invalid-end-tag
错误展示: 问题原因: iView将标签渲染为原生html标签时,由于这些标签是自闭合的,所以有end标签会报错. 解决方案: 修改配置文件,忽略该项检查: 根目录下 - .eslintrc.js - ...
- JAVA基础——时间Date类型转换
在java中有六大时间类,分别是: 1.java.util包下的Date类, 2.java.sql包下的Date类, 3.java.text包下的DateFormat类,(抽象类) 4.java.te ...
- finally最常用的情况
通常用于关闭(释放)资源例如:数据库连接 执行查询时查到需要的需要后 需要关闭连接, 此处连接就需要在获取到结果后 就断开连接 不然访问人数过多,数据库有最大连接数,超过了就只能等待前 ...
- Pro*C介绍
内嵌SQL 概要 Pro*C语法 SQL 预处理指令 语句标号 宿主变量 基础 指针 结构 数组 指示器变量 数据类型同等化 动态SQL 事务 错误处理 SQLCA WHENEVER语句 Demo程序 ...
- MySQL 基础 简单操作
一.数据库基础 什么是数据库 数据库:保存有组织的数据的容器(通常是一个文件或一组文件). 表:是一种结构化的文件,可以用来存储数据(类似Excel表).数据库就是由成千上万个表组成. 什么事SQL ...
- keras实例学习-双向LSTM进行imdb情感分类
源码:https://github.com/keras-team/keras/blob/master/examples/imdb_bidirectional_lstm.py 及keras中文文档 1. ...
- Elasticsearch5.x创建索引(Java)
索引创建代码使用官方给的示例代码,我把它在java项目里实现了一遍. 官方示例 1.创建索引 /** * Java创建Index */ public void CreateIndex() { int ...