题意:长度为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送饮料的更多相关文章

  1. 题解-CF755G PolandBall and Many Other Balls

    题面 CF755G PolandBall and Many Other Balls 给定 \(n\) 和 \(m\).有一排 \(n\) 个球,求对于每个 \(1\le k\le m\),选出 \(k ...

  2. CF755G PolandBall and Many Other Balls 题解

    从神 Karry 的题单过来的,然后自己瞎 yy 了一个方法,看题解区里没有,便来写一个题解 一个常数和复杂度都很大的题解 令 \(dp_{i,j}\) 为 在 \(i\) 个球中选 \(j\) 组的 ...

  3. FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅱ

    因为垃圾电脑太卡了就重开了一个... 前传:多项式Ⅰ u1s1 我预感还会有Ⅲ 多项式基础操作: 例题: 26. CF438E The Child and Binary Tree 感觉这题作为第一题还 ...

  4. POJ 3687 Labeling Balls()

    Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9641 Accepted: 2636 Descri ...

  5. Soj题目分类

    -----------------------------最优化问题------------------------------------- ----------------------常规动态规划 ...

  6. codeforces 755C. PolandBall and Forest

    C. PolandBall and Forest time limit per test 1 second memory limit per test 256 megabytes input stan ...

  7. codeforces 755F F. PolandBall and Gifts(贪心+多重背包)

    题目链接: F. PolandBall and Gifts time limit per test 1.5 seconds memory limit per test 256 megabytes in ...

  8. Codeforces 755 F. PolandBall and Gifts 多重背包+贪心

    F. PolandBall and Gifts   It's Christmas time! PolandBall and his friends will be giving themselves ...

  9. 【codeforces 755B】PolandBall and Game

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

随机推荐

  1. css3两个汤圆亲吻动效

    效果图: 模板来源:https://www.17sucai.com/pins/demo-show?id=35132 自己仿写出来的效果图: 笔记: 1.transform:translate(-50% ...

  2. Spring Cloud服务保护

    微服务虽然解决了传统单体式应用各个模块之间强耦合的缺点,但同时也引出了新问题,由于微服务各个服务之间是独立部署的,并且一般情况下一个服务往往会依赖多个其他服务,并且服务之间的调用更多的是依赖不稳定的网 ...

  3. BZOJ 3546 [ONTAK2010]Life of the Party (二分图最大匹配必须点)

    题解:给出一个二分图,问你取点哪个点会使得二分图匹配数减少. 解法:其实就是问二分图匹配的必须点.先对初始二分图做一次最大匹配. 现在考虑左边点,看残余网络上的边重新构图:如果是匹配边那么就从右往左连 ...

  4. PHP-缺失的第一个正数

    给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0]输出: 3示例 2: 输入: [3,4,-1,1]输出: 2示例 3: 输入: [7,8,9,11,12] ...

  5. elasticsearch依赖的jackson-jar包与jboss依赖的jackson-jar包“版本”冲突

    elasticsearch依赖的jackson-jar包与jboss依赖的jackson-jar包“版本”冲突,导致elasticsearch相关功能在本地tomcat服务器正常,但是部署到jboss ...

  6. Mate Translate的特色功能phrasebook 常用语手册介绍

    Mate Translate是Mac os系统上一款多国语言即时翻译工具,支持103种语言之间的即时互译,还可以在你的所有设备之间轻松同步.Mate Translate 不但推出了适应各个平台使用的客 ...

  7. phpStudy的安装和配置

    一,下载工具 官网:http://www.phpstudy.net/,选择自己要安装的版本 二.多个站点和域名配置 1.打开phpStudy=>点击“其它选项菜单”=>点击“站点域名管理” ...

  8. js 加载验证码

    <img id="captchaPic" src="{{captcha_src('math')}}" onclick="this.src='{{ ...

  9. cookie和session 的初步介绍

    Cookie和Session http协议不保存用户状态(信息) Cookie和Session都是为了能够保存用户信息 Cookie: 本质:保存在浏览器上的键值对 用途:标识当前用户信息 cooki ...

  10. linux文件目录颜色及特殊权限对应的颜色

    白色:表示普通文件蓝色:表示目录绿色:表示可执行文件红色:表示压缩文件浅蓝色:链接文件红色闪烁:表示链接的文件有问题黄色:表示设备文件灰色:表示其它文件 各种背景颜色的显示和文件的权限有关红色背景:特 ...