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 ...
随机推荐
- Codeforces 251C Number Transformation DP, 记忆化搜索,LCM,广搜
题意及思路:https://blog.csdn.net/bossup/article/details/37076965 代码: #include <bits/stdc++.h> #defi ...
- qdatatime大小
QDateTime time1; QDateTime time2; uint stime = time1.toTime_t(); uint etime = time2.toTime_t(); int ...
- fiddler增加ip以及响应时间列
最近打算看一下移动端app的响应等请求,这里打算用fillder来查看appium的模拟出发请求的操作来查看结果, 所以我们需要在左侧的面板增加我们所需要的ip,响应时间等数据以方便我们查看 fidd ...
- 08-01-json-loggin-模块
复习 ''' ATM: -- start.py BASE_DIR = os.path.dirname(__file__) sys.path.append(BASE_DIR) -- conf -- li ...
- 泛型(Java 5 开始)
前言 Java 5 开始之前,从集合读取的数据都必须进行类型转换,如果插入错误的数据就会报错. 有了泛型,编译器会自动为你的插入进行转换,并在插入时告知是否插入了类型错误的对象. 将类型由原来的具体的 ...
- Vue2.0源码思维导图-------------Vue 构造函数、原型、静态属性和方法
已经用vue有一段时间了,最近花一些时间去阅读Vue源码,看源码的同时便于理解,会用工具画下结构图. 今天把最近看到总结的结构图分享出来.希望可以帮助和其他同学一起进步.当然里边可能存在一些疏漏的,或 ...
- html+css 常用布局
1.中间固定宽度,两侧自适应 1.1 flex布局 <!DOCTYPE html><html lang="en"> <head> <met ...
- socket模拟通信
import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java ...
- 用 Flask 来写个轻博客 (1) — 创建项目
目录 目录 前言 扩展阅读 部署开发环境 创建 Github 项目 前言 一步一步的实现一个 Flask 轻博客项目启动,最新的代码会上传到 Github. 扩展阅读 欢迎使用 Flask - vir ...
- 访问者模式和 ASM
文章目录 一. 概述 & 定义 二. 示例 2.1 创建抽象元素 2.2 创建具体元素 2.3 创建抽象访问者 2.4 创建具体访问者 2.5 访问者代码调用 三. ASM 中的访问者模式 3 ...