题面

思路

问题转化

这个问题的核心在于,我们需要把“加入一个球、拿出一个球”这两个操作转化一下

因为显然两个操作同时进行的话,我们没有办法从单纯的组合意义去分析

我们首先把$m$个球拿出来,表示全部都选拿走球

然后对于我们选定的加入球的操作,我们一次性加入两个球

这样问题就变成了一个单纯加入球的问题了

左右分开

现在的问题是这样的:

给定$n-m$个球,你有$m$次机会,每次可以加入两个球,最后你会拿出$k$个球,问总方案数

我们把$k$个球的来源分开考虑

假设$k$个里面有$i$个来自于原来的$n-m$个球,$k-i$个来自于新加入的球

那么选出$i$个的方案数应该为$C^i_{n-m}$

后面新加入的球,我们考虑一个递推:$f[i][j]$表示从$i$对球中拿了东西,一共取出来了$j$个

那么新加入一对球,可以选择拿一个或者拿两个,因此可以写出方程

$g[i][j]=f[i-1][j-2]+f[i-1][j-1]*2$

计算答案

这个方程得到之后就好办了

我们先枚举$k$个里面从原来球中选出的个数,再枚举剩下的$k-i$用了多少对球($j$)

然后除了上面的两个东西要乘起来之外,还要再乘以$C{m}_j$和$2{m-j}$,分别表示选出$j$对的方案,以及剩下的没有取出的东西做出的贡献

式子如下:

$Ans = \sum_{i=0}^k \sum_{j= \frac{k-i}{2} }^{k-i } C(n-m,i) \ast C(m,j) \ast 2^{m-j} \ast f[k-i][j]$

这里面的组合数每次询问单独处理,$f$数组可以预处理好,总复杂度$O(Tk^2)$

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
#define MOD 1000000007
using namespace std;
ll n,m,k,f[1010][1010],suf[510],suff[510],pre[510],C[510],CC[510],pw[510];
ll qpow(ll a,ll b){
ll re=1;
if(b<0) return 0;
while(b){
if(b&1) re=re*a%MOD;
a=a*a%MOD;b>>=1;
}
return re;
}
void init(ll p,ll q){
memset(C,0,sizeof(C));memset(CC,0,sizeof(CC));
int i;C[0]=1;CC[0]=1;
suf[1]=p;suff[1]=q; for(i=2;i<=min(p,k);i++) suf[i]=suf[i-1]*(p-i+1ll)%MOD;
for(i=2;i<=min(q,k);i++) suff[i]=suff[i-1]*(q-i+1ll)%MOD; for(i=1;i<=min(p,k);i++) C[i]=suf[i]*pre[i]%MOD;
for(i=1;i<=min(q,k);i++) CC[i]=suff[i]*pre[i]%MOD;
}
void getf(){
int i,j,len=310;
f[0][0]=1;
for(i=1;i<=len;i++){
for(j=1;j<=i*2;j++){
f[i][j]=(f[i-1][j-1]*2+f[i-1][j-2])%MOD;
}
}
}
int main(){
getf();int T;scanf("%d",&T);
pre[1]=1;
for(int i=2;i<=500;i++) pre[i]=(pre[i-1]*qpow(i,MOD-2))%MOD;
while(T--){
scanf("%lld%lld%lld",&n,&m,&k);
init(n-m,m);
ll ans=0,tmp;int i,j;
for(i=0;i<=k;i++) pw[i]=qpow(2,m-i);
for(i=0;i<=k;i++){
tmp=0;
for(j=(k-i+1)/2;j<=k-i;j++){
(tmp+=CC[j]*pw[j]%MOD*f[j][k-i]%MOD)%=MOD;
}
(ans+=tmp*C[i]%MOD)%=MOD;
}
printf("%lld\n",ans);
}
}

Crash的游戏 [组合+递推]的更多相关文章

  1. 2825 codevs危险的组合(递推)

    2825 危险的组合 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有一些装有铀(用U表示)和铅(用L表示)的盒子,数量均足够 ...

  2. Codeforces Round #526 C - The Fair Nut and String /// 组合递推

    题目大意: 给定原字符序列 找出其中所有子序列满足 1.序列内字符都为a 2.若有两个以上的字符 则相邻两个字符在原序列中两者之间存在字符b 的数量 将整个字符序列用b分开 此时再得到每个b之间a的数 ...

  3. UVA 557 Burger 排列组合递推

    When Mr. and Mrs. Clinton's twin sons Ben and Bill had their tenth birthday, the party was held at t ...

  4. BZOJ 1411&&Vijos 1544 : [ZJOI2009]硬币游戏【递推,快速幂】

    1411: [ZJOI2009]硬币游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 897  Solved: 394[Submit][Status ...

  5. P1397 [NOI2013]矩阵游戏(递推)

    P1397 [NOI2013]矩阵游戏 一波化式子,$f[1][m]=a^{m-1}+b\sum_{i=0}^{m-2}a^i$,用快速幂+逆元求等比数列可以做到$logm$ 设$v=a^{m-1}, ...

  6. 逆元 组合A(n,m) C(n,m)递推 隔板法

    求逆元 https://blog.csdn.net/baidu_35643793/article/details/75268911 int inv[N]; void init(){ inv[] = ; ...

  7. CH 3401 - 石头游戏 - [矩阵快速幂加速递推]

    题目链接:传送门 描述石头游戏在一个 $n$ 行 $m$ 列 ($1 \le n,m \le 8$) 的网格上进行,每个格子对应一种操作序列,操作序列至多有 $10$ 种,分别用 $0 \sim 9$ ...

  8. P1759 通天之潜水(不详细,勿看)(动态规划递推,组合背包,洛谷)

    题目链接:点击进入 题目分析: 简单的组合背包模板题,但是递推的同时要刷新这种情况使用了哪些物品 ac代码: #include<bits/stdc++.h> using namespace ...

  9. 递推,求至少连续放置三个U的危险组合

    UVA580-Critical Mass 题意 有两种方块,L和U,有至少三个连续的U称为危险组合,问有多少个危险组合 solution: 至少这个概念比较难求 ,所以转化为(1ll<<n ...

随机推荐

  1. Linq to Entity 时间差作为筛选条件产生的问题

    前言 在使用 Linq to Entity 的時候,會把之前 Linq to SQL 的想法就帶進去,寫好之後編譯也都不會出錯,但是實際上在跑的時候就會出現錯誤訊息了,這點真的要注意了.這次我遇到問題 ...

  2. Spring 中IOC(控制反转)&& 通过SET方式为属性注入值 && Spring表达式

    ### 1. Spring IoC IoC:Inversion of control:控制反转:在传统开发模式下,对象的创建过程和管理过程都是由开发者通过Java程序来实现的,操作权在开发者的Java ...

  3. Python元组,列表,字典,集合

    1.元组 元组是有序的,只有index和count两种方法,一看到元组,就提醒是不可更改的 names = ('wll', 'ly', 'jxx', 'syq') (1)index方法 print(n ...

  4. python学习之map函数和reduce函数的运用

    MapReduce:面向大型集群的简化数据处理引文 map()函数 Python中的map()函数接收两个参数,一个是调用函数对象(python中处处皆对象,函数未实例前也可以当对象一样调用),另一个 ...

  5. B1018 锤子剪刀布 (20分)

    B1018 锤子剪刀布 (20分) 大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势. 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. ...

  6. 16,docker入门

      在学一门新知识的时候,超哥喜欢提问,why?what?how? wiki资料 什么是docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一 ...

  7. Android 布局开发之百分比布局、弹性布局

    1.百分比布局 很简单,超级简单.引用之后就可以使用了. compile 'com.android.support:percent:23+' git地址: https://github.com/Jul ...

  8. django之python3.4及以上连接mysql的一些问题记录

    首先,祭出大杀器whl https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient django1.x与django2.x 在项目的写法上有一些区别 ...

  9. Mybatis常用xml

    工作中mybatis常用的xml代码 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ma ...

  10. UR官网特效

    <!DOCTYPE html>                              <!--申明文档类型:html--> <html lang="en&q ...