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 ...
随机推荐
- json数据扁平化处理
json数据扁平化处理 /* * name:json数组拉平处理 * data:json对象或者数组 * k:前面开始可传空 */ function expandJsonTool(data, k) { ...
- cmd登录mysql、查所有的库、查所有的表、查表下的所有字段
一.设置好mysql的环境变量,cmd之后输入mysql -u root -p 输入password进入mysql 二.展示所有的库名show batabases: 三.选择一个库名use dem ...
- 【记录】centOS 搭建logstash +docker搭建elasticsearch伪集群+kibana链接集群elasticsearch节点
[注意]本文主要用于自我记录,注释较少. 安装logstash 1.上传logstash-6.4.3.tar.gz到服务中 2.tar –zxvf logstash-6.4.3.tar.gz 3.cd ...
- show line numbers
- Begin at this time
学习了一段时间的Python,今天终于下定决心建立博客来记录自己的机器学习之路了.希望这是一个好的开始,希望自己永远不放弃,坚持努力下去.
- loj2064[HAOI2016]找相同字符
题意:给你两个字符串,问其中各取一个子串,有多少对相同?n<=20W. 标程: #include<bits/stdc++.h> using namespace std; typede ...
- bcpow — 任意精度数字的乘方
bcpow — 任意精度数字的乘方 说明 string bcpow ( string $left_operand , string $right_operand [, int $scale ] ) 左 ...
- pip install RISE报错解决
ERROR: Cannot uninstall 'tornado' ERROR: Cannot uninstall 'tornado'. It is a distutils installed pro ...
- table响应式设计
table不可用flex布局和td宽度的自适应. table外层加div.mml-table设置overflow-x:auto可以添加横向滚动条.
- PHP FILTER_UNSAFE_RAW 过滤器
定义和用法 FILTER_UNSAFE_RAW 过滤器不进行任何过滤,去除或编码特殊字符. 该过滤器删除那些对应用程序有潜在危害的数据.它用于去除标签以及删除或编码不需要的字符. 如果不规定标志,则该 ...