洛谷题面传送门 & Atcoder 题面传送门

首先考虑合法的排列长什么样,我们考虑将每次操作者的编号记录下来形成一个序列(第一次 A 操作不计入序列),那么显然这个序列中必须恰好含有 \(n\) 个 A,且最后一个必须是 A。那么显然一个合法的取卡片方案唯一对应一个操作序列,而一个长度为 \(l\) 的操作序列恰好对应 \(3^{n+m+k-l}\) 个合法的取卡片方案(证明?就每次下一轮执行操作的人是谁就在对应的操作者所取的卡片上写啥,那么显然对于长度为 \(l\) 的操作序列而言,在原卡片堆中恰好有 \(l\) 张卡片上的数是确定下来的,另外 \(n+m+k-l\) 张可以 randomly 乱填,方案数就是 \(3^{n+m+k-l}\))

然后考虑怎样统计方案,我们枚举操作序列中 BC 出现次数 \(c\),那么操作序列长度即为 \(c+n\),其中有一个 A 的位置已经确定了,那么填好另外 \(n-1\) 个 A 的方案数即是 \(\dbinom{n+c-1}{n-1}\),如果我们能求出填好 B、C 的方案数 \(f_k\),就有 \(ans=\sum\limits_{c=0}^{m+k}\dbinom{n+c-1}{n-1}f_c·3^{m+k-c}\)。

接下来考虑怎样求 \(f_c\),首先列出柿子,枚举 B 的个数然后组合数统计答案,即

\[f_c=\sum\limits_{i}\dbinom{c}{i}[i\le m][c-i\le k]
\]

上式也可以写作

\[f_c=\sum\limits_{c-k\le i\le m}\dbinom{c}{i}
\]

我们知道组合数下底数求和是无法直接求的,不过注意到组合数有个递推公式 \(\dbinom{n}{k}=\dbinom{n-1}{k}+\dbinom{n-1}{k-1}\),因此考虑从数列递推的角度理解这道题,即:

\[\begin{aligned}
f_c&=\sum\limits_{c-k\le i\le m}\dbinom{c}{i}\\
&=\sum\limits_{c-k\le i\le m}\dbinom{c-1}{i}+\dbinom{c-1}{i-1}\\
&=\sum\limits_{c-k\le i\le m}\dbinom{c-1}{i}+\sum\limits_{c-k\le i\le m}\dbinom{c-1}{i-1}\\
&=\sum\limits_{c-k\le i\le m}\dbinom{c-1}{i}+\sum\limits_{c-k-1\le i\le m-1}\dbinom{c-1}{i}\\
&=2\sum\limits_{c-1-k\le i\le m}\dbinom{c-1}{i}-\dbinom{c-1}{m}-\dbinom{c-1}{c-k-1}\\
&=2f_{c-1}-\dbinom{c-1}{m}-\dbinom{c-1}{c-k-1}
\end{aligned}
\]

递推求一下即可,时间复杂度线性。

const int MAXN=9e5;
const int MOD=1e9+7;
int n,m,k,fac[MAXN+5],ifac[MAXN+5],f[MAXN+5],pw3[MAXN+5];
void init_fac(int n){
for(int i=(fac[0]=ifac[0]=ifac[1]=pw3[0]=1)+1;i<=n;i++) ifac[i]=1ll*ifac[MOD%i]*(MOD-MOD/i)%MOD;
for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%MOD,ifac[i]=1ll*ifac[i-1]*ifac[i]%MOD;
for(int i=1;i<=n;i++) pw3[i]=3ll*pw3[i-1]%MOD;
}
int binom(int x,int y){
if(x<0||y<0||x<y) return 0;
return 1ll*fac[x]*ifac[y]%MOD*ifac[x-y]%MOD;
}
int main(){
scanf("%d%d%d",&n,&m,&k);init_fac(n+m+k);
f[0]=1;for(int i=1;i<=m+k;i++)
f[i]=(2ll*f[i-1]-binom(i-1,m)-binom(i-1,i-k-1)+MOD*2ll)%MOD;
int ans=0;for(int i=0;i<=m+k;i++) ans=(ans+1ll*pw3[m+k-i]*binom(n-1+i,i)%MOD*f[i])%MOD;
printf("%d\n",ans);
return 0;
}

Atcoder Regular Contest 061 D - Card Game for Three(组合数学)的更多相关文章

  1. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  2. AtCoder Regular Contest 061 DSnuke's Coloring

    http://arc061.contest.atcoder.jp/tasks/arc061_b 题意: H行W列的矩阵中,然后挖了n个洞,输出j(0-9)行,对于第i行输出,有多少个3*3区域中有i个 ...

  3. [Atcoder Regular Contest 061] Tutorial

    Link: ARC061 传送门 C: 暴力$dfs$就好了 #include <bits/stdc++.h> using namespace std; typedef long long ...

  4. AtCoder Regular Contest 061 E - すぬけ君の地下鉄旅行【最短路】

    具体题解又要搬大哥的了,嘿嘿~ 请点击:G点我 这道题目的难点就是同一家公司的路直接走不需要再花费,然后多了一个公司这个东西,这个不像是边的副权值(瞎说的)之类的东西,这是对于路来说的,路的属性... ...

  5. Atcoder Regular Contest 096 C - Everything on It(组合数学)

    Atcoder 题面传送门 & 洛谷题面传送门 简单题,由于这场 arc 的 F 是 jxd 作业而我不会做,所以只好来把这场的 E 水掉了. 我们记 \(f(i)\) 为钦定 \(i\) 个 ...

  6. AtCoder Regular Contest 094 (ARC094) CDE题解

    原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...

  7. AtCoder Regular Contest 092

    AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...

  8. AtCoder Regular Contest 093

    AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...

  9. AtCoder Regular Contest 094

    AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...

随机推荐

  1. 性能利器 Takin 来了!首个生产环境全链路压测平台正式开源

    6 月 25 日,国内知名的系统高可用专家数列科技宣布开源旗下核心产品能力,对外开放生产全链路压测平台产品的源代码,并正式命名为 Takin. 目前中国人寿.顺丰科技.希音.中通快递.中国移动.永辉超 ...

  2. AtCoder Beginner Contest 223

    AtCoder Beginner Contest 223 A是纯纯的水题,就不说了 B - String Shifting 思路分析 我真的sb,一开始想了好久是不是和全排列有关,然后读了好几遍题目也 ...

  3. 注解,@Qualifier+@Autowired 和 @Resource

    摘要: 项目中,对于AOP的使用,就是通过用注解来注入的. 更改之前的注解,是使用:@Qualifier+@Autowired   但是,通过这样注解,在项目启动阶段,需要自动扫描的过程是非常缓慢的, ...

  4. Beta实际开发与初始计划的比较

    零.说明 本篇博客为Beta阶段开始十天后,实际开发工作与初始计划的比较 截止至本篇博客发布为止,团队所有成员已完成计网考试,将在本周日进行充分的接口测试 一.比较 1.与初始计划对比 初始计划 实际 ...

  5. Vue接收后端传过来excel表格的文件流并下载

    题外话:当接收文件流时要确定文件流的类型,但也有例外就是application/octet-stream类型,主要是只用来下载的类型,这个类型简单理解意思就是通用类型类似 var .object.ar ...

  6. elasticsearch地理位置查询

    elasticsearch地理位置查询 一.背景 二.geo数据类型 1.geo_point 2.geo_shape 三.此处对geo_point类型实战 1.背景 2.插入地点数据 1.创建索引 2 ...

  7. python redis自带门神 lock 方法

    redis 支持的数据结构比较丰富,自制一个锁也很方便,所以极少提到其原生锁的方法.但是在单机版redis的使用时,自带锁的使用还是非常方便的.自己有车还打啥滴滴顺风车是吧,本篇主要介绍redis-p ...

  8. Noip模拟19(炸裂的开始) 2021.7.18

    T1 u 差分与前缀的综合练习. 分析数据范围,只能是在修改的时候$O(1)$做到,那么只能是像打标记一样处理那个三角形 正解是建立两个二位前缀和,一个控制竖向,一个控制斜向 每次在三角的左上,右下, ...

  9. NOIP模拟22

    T1d 一道垃圾贪心,写个堆优化或者桶就行 1 #include<bits/stdc++.h> 2 #define int long long 3 using namespace std; ...

  10. 创建线程 出现SIGSEGV crash

    在Opwrt平台上测试ok的一个网络传输延时测试demo程序移植到Android平台后,运行出现莫名其妙的SIGSEGV crash. 仔细检查过源码,特别是指针等后未发现问题. --------- ...