Crash的游戏 [组合+递推]
题面
思路
问题转化
这个问题的核心在于,我们需要把“加入一个球、拿出一个球”这两个操作转化一下
因为显然两个操作同时进行的话,我们没有办法从单纯的组合意义去分析
我们首先把$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的游戏 [组合+递推]的更多相关文章
- 2825 codevs危险的组合(递推)
2825 危险的组合 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有一些装有铀(用U表示)和铅(用L表示)的盒子,数量均足够 ...
- Codeforces Round #526 C - The Fair Nut and String /// 组合递推
题目大意: 给定原字符序列 找出其中所有子序列满足 1.序列内字符都为a 2.若有两个以上的字符 则相邻两个字符在原序列中两者之间存在字符b 的数量 将整个字符序列用b分开 此时再得到每个b之间a的数 ...
- UVA 557 Burger 排列组合递推
When Mr. and Mrs. Clinton's twin sons Ben and Bill had their tenth birthday, the party was held at t ...
- BZOJ 1411&&Vijos 1544 : [ZJOI2009]硬币游戏【递推,快速幂】
1411: [ZJOI2009]硬币游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 897 Solved: 394[Submit][Status ...
- P1397 [NOI2013]矩阵游戏(递推)
P1397 [NOI2013]矩阵游戏 一波化式子,$f[1][m]=a^{m-1}+b\sum_{i=0}^{m-2}a^i$,用快速幂+逆元求等比数列可以做到$logm$ 设$v=a^{m-1}, ...
- 逆元 组合A(n,m) C(n,m)递推 隔板法
求逆元 https://blog.csdn.net/baidu_35643793/article/details/75268911 int inv[N]; void init(){ inv[] = ; ...
- CH 3401 - 石头游戏 - [矩阵快速幂加速递推]
题目链接:传送门 描述石头游戏在一个 $n$ 行 $m$ 列 ($1 \le n,m \le 8$) 的网格上进行,每个格子对应一种操作序列,操作序列至多有 $10$ 种,分别用 $0 \sim 9$ ...
- P1759 通天之潜水(不详细,勿看)(动态规划递推,组合背包,洛谷)
题目链接:点击进入 题目分析: 简单的组合背包模板题,但是递推的同时要刷新这种情况使用了哪些物品 ac代码: #include<bits/stdc++.h> using namespace ...
- 递推,求至少连续放置三个U的危险组合
UVA580-Critical Mass 题意 有两种方块,L和U,有至少三个连续的U称为危险组合,问有多少个危险组合 solution: 至少这个概念比较难求 ,所以转化为(1ll<<n ...
随机推荐
- Linq to Entity 时间差作为筛选条件产生的问题
前言 在使用 Linq to Entity 的時候,會把之前 Linq to SQL 的想法就帶進去,寫好之後編譯也都不會出錯,但是實際上在跑的時候就會出現錯誤訊息了,這點真的要注意了.這次我遇到問題 ...
- Spring 中IOC(控制反转)&& 通过SET方式为属性注入值 && Spring表达式
### 1. Spring IoC IoC:Inversion of control:控制反转:在传统开发模式下,对象的创建过程和管理过程都是由开发者通过Java程序来实现的,操作权在开发者的Java ...
- Python元组,列表,字典,集合
1.元组 元组是有序的,只有index和count两种方法,一看到元组,就提醒是不可更改的 names = ('wll', 'ly', 'jxx', 'syq') (1)index方法 print(n ...
- python学习之map函数和reduce函数的运用
MapReduce:面向大型集群的简化数据处理引文 map()函数 Python中的map()函数接收两个参数,一个是调用函数对象(python中处处皆对象,函数未实例前也可以当对象一样调用),另一个 ...
- B1018 锤子剪刀布 (20分)
B1018 锤子剪刀布 (20分) 大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势. 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. ...
- 16,docker入门
在学一门新知识的时候,超哥喜欢提问,why?what?how? wiki资料 什么是docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一 ...
- Android 布局开发之百分比布局、弹性布局
1.百分比布局 很简单,超级简单.引用之后就可以使用了. compile 'com.android.support:percent:23+' git地址: https://github.com/Jul ...
- django之python3.4及以上连接mysql的一些问题记录
首先,祭出大杀器whl https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient django1.x与django2.x 在项目的写法上有一些区别 ...
- Mybatis常用xml
工作中mybatis常用的xml代码 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ma ...
- UR官网特效
<!DOCTYPE html> <!--申明文档类型:html--> <html lang="en&q ...