CF755G PolandBall and Many Other Balls/soj 57送饮料
题意:长度为n的序列,相邻两个或单独一个可以划分到一个组,每个元素最多处于一个组。
问恰好分割成k(1<=k<=m)段有多少种方案?
标程:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=;
const int rt=;
const int N=;
int l,_n,pos[N],n,k,a[N],b[N],c[N],x1[N],x2[N],x3[N],x4[N],w[N],wn,inv_n;
int ksm(int x,int y)
{
int res=;
while (y) {if (y&) res=(ll)res*x%mod; x=(ll)x*x%mod; y>>=;}
return res;
}
void init(int n)
{
l=;
while ((<<l)<=n) l++;//注意位长的处理,判断条件是(1<<l)<=n
_n=<<l;wn=ksm(rt,<<-l);
w[]=;inv_n=ksm(_n,mod-);
for (int i=;i<_n;i++)
w[i]=(ll)w[i-]*wn%mod,pos[i]=(i&)?pos[i-]|(<<(l-)):pos[i>>]>>;
}
void fft(int *a,int op)
{
for (int i=;i<_n;i++) if (i<pos[i]) swap(a[i],a[pos[i]]);
int len=,id=_n;
for (int i=;i<l;i++)
{
int wn=w[id>>=];
for (int j=;j<_n;j+=len*)
for (int k=j,w=;k<j+len;k++)
{
int l=a[k],r=(ll)a[k+len]*w%mod;
a[k]=((ll)l+r)%mod;a[k+len]=((ll)l-r+mod)%mod;
w=(ll)w*wn%mod;
}
len<<=;
}
if (op==-) {
reverse(a+,a+_n);
for (int i=;i<_n;i++) a[i]=(ll)a[i]*inv_n%mod;
}
}
void merge(int *a,int *b,int *c)
{
c[]=;
for (int i=;i<=k;i++) c[i]=((ll)((ll)b[i]+b[i-])%mod+a[i-])%mod;
for (int i=k+;i<_n;i++) c[i]=;
}
void solve(int n)
{
if (n==)
{
a[]=;for (int i=;i<_n;i++) a[i]=;
b[]=b[]=;for (int i=;i<_n;i++) b[i]=;
return;
}
if (n==)
{
a[]=a[]=;for (int i=;i<_n;i++) a[i]=;
b[]=b[]=;b[]=;for (int i=;i<_n;i++) b[i]=;
return;
}
solve(n/-);
merge(a,b,c);
for (int i=k+;i<_n;i++) a[i]=b[i]=;
fft(a,);fft(b,);fft(c,);
for (int i=;i<_n;i++)
{
x1[i]=(ll)a[i]*a[i]%mod;
x2[i]=(ll)b[i]*b[i]%mod;
x3[i]=(ll)a[i]*b[i]%mod;
x4[i]=(ll)b[i]*c[i]%mod;
}
fft(x1,-);fft(x2,-);fft(x3,-);fft(x4,-);
for (int i=;i<_n;i++)//从1开始,注意边界
x2[i]=((ll)x2[i]+x1[i-])%mod,x4[i]=((ll)x4[i]+x3[i-])%mod;
if (n&)
{
merge(x2,x4,b);
for (int i=;i<_n;i++) a[i]=x4[i];
}else
for (int i=;i<_n;i++) a[i]=x2[i],b[i]=x4[i];
}
int main()
{
scanf("%d%d",&n,&k);
init(*k+); solve(n);
for (int i=;i<=k;i++) printf("%d ",a[i]);
puts("");
return ;
}
题解:fft+分治+dp
可以得到递推式:f[i(元素数)][j(段数)]=f[i-1][j-1]+f[i-2][j-1]+f[i-1][j]。
f(n)=f(n-1)*(1+x)+f(n-2)*x.
一个方法是带权斐波那契通项展开,并不会多项式开根。
另一个方法,考虑f(a+b)=f(a)*f(b)+f(a-1)*f(b-1)*x。(根据在a,b处能否断开讨论)
分治下去,f(i),f(i+1)->f(i+2) f(2i+2)=f(i+1)*f(i+1)+f(i)*f(i)*x
f(2i+3)=f(i+1)*f(i+2)+f(i)*f(i+1)*x f(2i+4)=f(i+2)*f(i+2)+f(i+1)*f(i+1)*x
注意n的奇偶要讨论,m以后的k不用计算。时间复杂度O(mlog^2(m))。
CF755G PolandBall and Many Other Balls/soj 57送饮料的更多相关文章
- 题解-CF755G PolandBall and Many Other Balls
题面 CF755G PolandBall and Many Other Balls 给定 \(n\) 和 \(m\).有一排 \(n\) 个球,求对于每个 \(1\le k\le m\),选出 \(k ...
- CF755G PolandBall and Many Other Balls 题解
从神 Karry 的题单过来的,然后自己瞎 yy 了一个方法,看题解区里没有,便来写一个题解 一个常数和复杂度都很大的题解 令 \(dp_{i,j}\) 为 在 \(i\) 个球中选 \(j\) 组的 ...
- FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅱ
因为垃圾电脑太卡了就重开了一个... 前传:多项式Ⅰ u1s1 我预感还会有Ⅲ 多项式基础操作: 例题: 26. CF438E The Child and Binary Tree 感觉这题作为第一题还 ...
- POJ 3687 Labeling Balls()
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9641 Accepted: 2636 Descri ...
- Soj题目分类
-----------------------------最优化问题------------------------------------- ----------------------常规动态规划 ...
- codeforces 755C. PolandBall and Forest
C. PolandBall and Forest time limit per test 1 second memory limit per test 256 megabytes input stan ...
- codeforces 755F F. PolandBall and Gifts(贪心+多重背包)
题目链接: F. PolandBall and Gifts time limit per test 1.5 seconds memory limit per test 256 megabytes in ...
- Codeforces 755 F. PolandBall and Gifts 多重背包+贪心
F. PolandBall and Gifts It's Christmas time! PolandBall and his friends will be giving themselves ...
- 【codeforces 755B】PolandBall and Game
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
随机推荐
- js将数字转换成货币形式的字符
因为UI图上有的地方需要将数字转成货币形式的,例如:1234567转成 1,234,567 这样的,不过之前没弄过,然后在网上搜了下方法,参考了下面这篇文章 参考文章:JS将数字转成货币形式的简单 ...
- TypeScript和JavaScript的区别
JavaScript和TypeScript的对比 注:参考https://juejin.im/entry/5a52ed336fb9a01cbd586f9f做的笔记 概要介绍 JavaScript Ja ...
- 关于UEditor的使用配置(图片上传配置)
接到新需求,需要在平台上使用富文本编辑器,我这次选择了百度的UEditor 在官网上下载l.net版本的1.4.3开发版本 http://ueditor.baidu.com/website/downl ...
- linux下如何挂载磁盘
1.显示磁盘使用情况:#df 2.显示磁盘:#fdisk -l 3.格式化分区:#mkfs.ext4 /dev/vdb1 //注:将/dev/vdb1格式化为ext4类型(文件类型 ...
- HDU-3001 TSP+三进制DP
题意:给出一个无向图,每个点不能被经过超过两次,选择一个起点问经过所有点至少一次的最短路径. 解法:注意此题是每个点不能经过超过两次,这和一般的TSP问题不同.但是也没有使得此题变得很复杂,原来的状态 ...
- 单核cpu实现多任务原理
- java多线程面试题选择题大全含答案
v java多线程面试题选择题大全含答案 java多线程面试题选择题大全含答案 1.下面程序的运行结果()(选择一项)public static void main(String[] args) {T ...
- Postman Interceptor安装成功却无法在Postman启用的解决办法
新手在使用 Postman 和Postman Interceptor的过程中总会遇到各种各样的问题.我们 chrome插件网 争取在这里汇总大家遇到的所有的问题的解决方案.今天要分享的解决方案问题是: ...
- 初试avalon
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 管理员技术(六): 硬盘分区及格式化、 新建一个逻辑卷、调整现有磁盘的分区、扩展逻辑卷的大小、添加一个swap分区
一.硬盘分区及格式化 问题: 本例要求熟悉硬盘分区结构,使用fdisk分区工具在磁盘 /dev/vdb 上按以下要求建立分区: 1> 采用默认的 msdos 分区模式 2> ...