codeforces 140E.New Year Garland
传送门:
解题思路:
要求相邻两行小球颜色集合不同,并且限制行内小球相邻不同。
由此可得:每行小球排列都是独立与外界的,
所以答案应该是对于所有行的颜色集合分类,在将行内的答案乘到上面。
先考虑如何分类:
我们可以确定对于每行所取的颜色种类$x=|S|$,
若相邻两行$i,j$,其$x_i!=x_j$,那么一定是合法的,有$C_m^x$种选择方法。
而对于相邻两行$x_i=x_j$,对于行$i$的一种方案,只有一种可能使得$S_i=S_j$,
所以可以使用容斥来计算答案
综上所述,按照每行的颜色种类数来分类或许是可行的。
所以说我们表示出答案:
设该行共用$x$种颜色的方案数为$f(x)$,$f(x)$是对于所有的种类进行计数的,所以可以直接与颜色数为$x$的其他计数变量相乘,设第$n$行中颜色为$i$对整体的贡献为$ans_{n,i}$则:
$ans_n=C_m^x*f(x)*ans_{n-1}-f(x)*ans_{n-1,j}$
$ans_n=\sum\limits_{c=1}^{l_n}ans_{n,c}$
用函数$g_{i,j}$表示就是$ans_i=\sum g_{i,j}$表示前$i$行中最后一行用$j$个颜色方案数。
行间计数搞定了,就该考虑如何计算$f(x)$
由于刚才设$f(x)$为该行的方案数。这个看起来不太好求。
考虑什么决定了这个方案数。
是该行的球数以及颜色数。
所以不妨改写一下,$f(i,j)$表示用了$i$个球,共$j$种颜色的方案数,那么第$i$行的$f(x)$重写为$f(l_i,x)$
考虑一个一个来添加球,由于要求和前一个颜色不同,即可获得递推式:
$f(i,j)=f(i-1,j-1)+f(i-1,j)*(j-1)$
由于每次用到没有用过的颜色顺序是有序的,而所求的是对球颜色顺序无要求,那么最后使用的时候应写成:
$j!*f(i,j)$
球颜色数不会多于总数,那么$f(i,j)$,可以用二维数组来储存
最后一个问题就是p不是质数不能直接用逆元。
难不成要用拓展Lucas?
组合数可以提出来:
那么答案就是:
$g_{i,j}=A_{m}{j}*f(i,j)*\sum{g_{i-1}}-j!*f(i,j)*g_{i-1,j}$
其中$f_{(i,j)},j!,A_m^j$预处理就可以很愉快地A掉这道题目了
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long lnt;
lnt n,m,p;
lnt lmax;
lnt Am[];
lnt fac[];
lnt l[];
lnt f[][];
lnt g[][];
int main()
{
scanf("%lld%lld%lld",&n,&m,&p);
fac[]=Am[]=f[][]=;
for(int i=;i<=n;i++)
scanf("%lld",&l[i]),lmax=std::max(lmax,l[i]);
for(int i=;i<=lmax;i++)Am[i]=Am[i-]*(m-i+)%p;
for(int i=;i<=lmax;i++)fac[i]=fac[i-]*i%p;
for(int i=;i<=lmax;i++)for(int j=;j<=i&&j<=m;j++)
f[i][j]=(f[i-][j-]+f[i-][j]*(j-))%p;
lnt ans=,sum=;
for(int i=;i<=n;i++)
{
for(int j=;j<=l[i];j++)
{
lnt tmp=(Am[j]*ans-g[i&^][j]*fac[j])%p;
g[i&][j]=f[l[i]][j]*tmp%p;
sum+=g[i&][j];
}
ans=(sum%p+p)%p;
sum=;
memset(g[i&^],,sizeof(g[]));
}
printf("%lld\n",ans);
return ;
}
codeforces 140E.New Year Garland的更多相关文章
- CodeForces - 140E:New Year Garland (组合数&&DP)
As Gerald, Alexander, Sergey and Gennady are already busy with the usual New Year chores, Edward has ...
- codeforces problem 140E New Year Garland
排列组合题 题意 用m种颜色的彩球装点n层的圣诞树.圣诞树的第i层恰由l[i]个彩球串成一行,且同一层内的相邻彩球颜色不同,同时相邻两层所使用彩球的颜色集合不同.求有多少种装点方案,答案对p取模. 只 ...
- 【codeforces 758B】Blown Garland
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 1.23 codeforces div3 C.Nice Garland
You have a garland consisting of nn lamps. Each lamp is colored red, green or blue. The color of the ...
- Codeforces 758B:Blown Garland(模拟)
http://codeforces.com/problemset/problem/758/B 题意:给出一个字符串,每4个位置对应一个颜色,如果为‘!’的话,代表该灯泡是坏的,问最后每个颜色坏的灯泡的 ...
- CF codeforces A. New Year Garland【Educational Codeforces Round 79 (Rated for Div. 2)】
A. New Year Garland time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Codeforces 140E(排列组合、dp)
要点 主要学到的东西:一个序列染色,相邻不染同色,恰用\(j\)种颜色的1.模式数.2.方案数.3.具体染色数. 从大的思路上来讲:先dp预处理出每一层的模式数:\(f[i][j]\)表示\(i\)个 ...
- Codeforces 392 B Blown Garland
题意:输入是由连续的RYGB和字符!组成的字符串,R代表红灯,Y代表黄灯,G代表绿灯,B代表蓝灯.简而言之,就是给定的字符串保证了下标对4取余相同的灯颜色都相同,但是有的地方为‘!’代表这个灯坏了,然 ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
随机推荐
- Qt之图形(简笔画-绘制卡通蚂蚁)
简述 关于简笔画的介绍很多,有动物.水果.蔬菜.交通工具等,通常会对绘制一步步进行拆分.组合.然后绘制为我们想要的结果. 下面来介绍另外的一个种类:昆虫类-卡通蚂蚁. 简述 绘制 效果 源码 绘制 效 ...
- Extjs4.2 tooltip 提示宽度问题解决
在Extjs4.2 的tooltip 提示,宽度被限制在了40px,感觉非常别扭,是个BUG,解决的方法,在ext-all-debug.js或ext-all.js中,找到例如以下的代码: Ext.de ...
- 如何将visual studio 2010编辑模式改为插入???
按一下键盘上的 insert button 反之亦然
- ASIHTTPRequest 框架的导入
刚接触ios 对一切都不熟悉 记录一下ASIHTTPRequest 框架的导入 步骤 以便日后再用 1.首先下载ASIHTTPRequest:点击下载 2.在project中导入下面文件: 导入方式 ...
- bzoj3931: [CQOI2015]网络吞吐量(spfa+网络流)
3931: [CQOI2015]网络吞吐量 题目:传送门 题解: 现在有点难受....跳了一个多钟...菜啊... 题意都把做法一起给了....最短路+网路流啊. 不想说话...记得开long lon ...
- 求解n位格雷码
/************************************************************************* > File Name: Gray.cpp ...
- nyoj--116--士兵杀敌(二)(树状数组)
士兵杀敌(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军经常想知 ...
- rsync同步操作命令
在本地磁盘同步数据 将/home做个备份 # rsync -a --delete /home /backups -a 归档模式,表示以递归方式传输文件, -delete 删除那些接收端还有而发送端已经 ...
- Why functions - Not only for python
It may not be clear why it is worth the trouble to divide a program into functions. There are a lot ...
- 安卓开发--ListView
package com.zx.listview01; import java.util.ArrayList; import java.util.HashMap; import java.util.Li ...