题目

我竟然能做出九老师的组合计数题,尽管这题很呆

我们先考虑一个简单的问题,如果给定你要选出来的\(m\)张卡牌,如何做到攻击伤害最高

非常显然,因为保证了强化牌上的数字大于\(1\),所以我们优先选择那些强化牌,毕竟最小的一张只能翻两倍的强化牌都要比选择攻击牌好;选完强化牌之后剩下的攻击牌自然是越大越好

当然了,我们也不可能选出\(k\)张强化牌来,这样什么伤害都造不成,所以如果强化牌数量大于\(k\),我们就选择前\(k-1\)大的强化牌,配上最大的攻击牌

我们发现给定的强化牌和攻击牌都是无序的,我们先排序再说

之后我们就可以大力\(dp\)了

设\(dp_{i,j}\)表示前\(i\)张强化牌里选出\(j\)张所有强化牌乘积的和,\(f_{i,j}\)表示前\(i\)张强化牌里选择了\(j\)张且第\(i\)张一定被选择的乘积和

显然有转移

\[dp_{i,j}=dp_{i-1,j}+dp_{i-1,j-1}\times a_i\]

\[f_{i,j}=dp_{i-1,j-1}\times a_i\]

攻击牌这边我们设\(h_{i,j}\)表示前\(i\)张攻击牌里选择了\(j\)张的所有方案的和,\(g_{i,j}\)表示强迫选择第\(i\)张

也有转移

\[h_{i,j}=h_{i-1,j}+h_{i-1,j-1}+C_{i-1}^{j-1}\times b_i\]

\[g_{i,j}=h_{i-1,j-1}+C_{i-1}^{j-1}\times b_i\]

现在我们考虑枚举选择了多少张强化牌

设选择了\(i\)张强化牌,自然也就需要选择\(m-i\)张攻击牌

如果\(i<k\),那么这些强化牌都是要直接用的,选择的\(m-i\)张攻击牌里能被用于打出的\(k\)张的也就只有\(k-i\)张,而剩下的\(m-i-(k-i)=m-k\)张牌我们在后面随便选一下

于是答案就是

\[\sum_{j=0}^nf_{j,i}\times \sum_{j=0}^ng_{j,k-i}C_{n-j}^{m-k}\]

如果\(i>=k\),那么我们也只能选择\(k-1\)张强化牌,剩下的多选出来的\(i-k+1\)张我们还是从后面的位置里选出来,实际上需要的攻击牌也就只有\(1\)张,需要额外多选的攻击牌也就只有\(m-i-1\)张

答案就是

\[\sum_{j=0}^nf_{j,k-1} C_{n-j}^{i-k+1}\times \sum_{j=0}^ng_{j,1}C_{n-j}^{m-i-1}\]

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read() {char c=getchar();int x=0;while(c<'0'||x>'9') c=getchar();while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const int mod=998244353;
const int maxn=3005;
int c[maxn][maxn];
int dp[maxn][maxn],f[maxn][maxn];
int g[maxn][maxn],h[maxn][maxn];
int T,n,m,k;
int a[maxn],b[maxn];
inline int C(int n,int m) {if(m>n) return 0;return c[n][m];}
inline int cmp(int A,int B) {return A>B;}
int main() {T=read();int M=maxn-5;for(re int i=0;i<=M;i++) c[i][0]=c[i][i]=1;for(re int i=1;i<=M;i++)for(re int j=1;j<i;j++)c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;while(T--) {n=read(),m=read(),k=read();for(re int i=1;i<=n;i++) a[i]=read();for(re int i=1;i<=n;i++) b[i]=read();std::sort(a+1,a+n+1,cmp);std::sort(b+1,b+n+1,cmp);dp[0][0]=1;for(re int i=1;i<=n;i++)for(re int j=0;j<=i;j++) {dp[i][j]=dp[i-1][j];if(j) dp[i][j]=(dp[i][j]+1ll*dp[i-1][j-1]*a[i]%mod)%mod;}f[0][0]=1;for(re int i=1;i<=n;i++) for(re int j=1;j<=i;j++) f[i][j]=1ll*dp[i-1][j-1]*a[i]%mod;h[0][0]=0;for(re int i=1;i<=n;i++)for(re int j=0;j<=i;j++) {h[i][j]=h[i-1][j];if(j) h[i][j]=(h[i][j]+1ll*C(i-1,j-1)*b[i]%mod+h[i-1][j-1])%mod;}for(re int i=1;i<=n;i++)for(re int j=1;j<=i;j++)g[i][j]=(1ll*C(i-1,j-1)*b[i]%mod+h[i-1][j-1])%mod;int ans=0;for(re int i=0;i<m;i++) {int now=0;for(re int j=0;j<=n;j++) {if(i<=k-1) now=(now+f[j][i])%mod;else now=(now+1ll*f[j][k-1]*C(n-j,i-k+1)%mod)%mod;}int tot=0,res=0;if(i<=k-1) res=k-i;else res=1;for(re int j=0;j<=n;j++) tot=(tot+1ll*g[j][res]*C(n-j,m-i-res)%mod)%mod;ans=(ans+1ll*now*tot%mod)%mod;}printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/asuldb/p/10758306.html

[PKUWC2018]Slay the Spire相关推荐

  1. 杀戮尖塔(Slay the Spire) mod制作 --- 1

    偶然间发现了杀戮尖塔是用java写的(震撼我一分钟),然后秉着试一试java准备尝试杀戮尖塔mod制作. 这篇文章主要是靠知乎上的文章和反编译其他现有的mod摸摸索索凑出来的,主要给有一定基础的人大致 ...

  2. loj2538 「PKUWC2018」Slay the Spire 【dp】

    题目链接 loj2538 题解 比较明显的是,由于强化牌倍数大于\(1\),肯定是能用强化牌尽量用强化牌 如果强化牌大于等于\(k\),就留一个位给攻击牌 所以我们将两种牌分别排序,企图计算\(F(i ...

  3. 「PKUWC2018」Slay the Spire

    国际惯例不放题干 扯淡 其实题目翻译过来是杀戮尖塔,某steam上的卡牌游戏,我也曾热衷刷榜 题解 首先题目中要求的期望是假期望,结合题目中所给的阶乘就可以看出这其实是从$2*n$张牌中选择$m$张牌 ...

  4. P5299-[PKUWC2018]Slay the Spire【dp】

    前言 正题 题目链接:https://www.luogu.com.cn/problem/P5299 题目大意 有2n2n2n张牌, nnn张强化牌,每张上有一个正整数x(x>1)x(x>1 ...

  5. 游戏:杀戮尖塔(Slay the spire)mod--拉格朗·月

    This is a mod for SlayTheSpire! 这是一个杀戮尖塔的MOD! 角色名称:拉格朗·月 Now, I am developing. 目前正在开发中. GitHub源码: ht ...

  6. 2020.6月做题记录

    长期计划 SAM专题 date:2020.05.21-2020.06.01 基础类: Problem Finished P3804 [模板]后缀自动机 (SAM) √√√ SP1811 LCS - L ...

  7. linux查看一个进程最大tcp连接数,linux修改TCP最大连接数

    环境 操作系统: oracle-linux7.3 修改系统支持的最大TCP连接 最大tcp连接数和系统允许打开的最大文件数,用户允许打开的最大文件数,TCP网络连接可用的端口范围有关,取上述的最小值: ...

  8. 能够在Linux系统中运行的5款大型耐玩游戏

    Linux 可能不会很快成为游戏玩家选择的平台 -- Valve Steam Machines 的失败似乎是对这一点的深刻提醒 -- 但这并不意味着该平台没有稳定增长,并且拥有相当多的优秀游戏. 从独 ...

  9. PKUWC 2018游记

    PKUWC 2018游记 标签: Day\([-inf,0)\) 停课之后一直各种浪的飞起,考试rank20+,不搞颓但是学习很没有状态.还经常带着耳机被谢总抓了好几次,然后被拉过去谈话了好几次... ...

  10. 名片互赞软件(安卓版)

    软件简介: 名片互赞,真实有效.每天最多 1000 赞其实有时候不止的,应该 1000+.1000 上万还是没问题的,你甚至可以用它做业务. 话不多说,附上下载地址吧! 下载地址:         h ...

最新文章

  1. python2.7解释器安装教程_Python解释器安装教程以及环境变量配置
  2. [保护模式]PAE模式
  3. 一段JAVA签名算法的PHP改写
  4. Hibernate的CURD操作
  5. php移动端url,什么是PC和移动端URL路径规范化
  6. 用汇编的眼光看C++(之循环流程)
  7. 给git命令设置别名
  8. Windows内核之系统架构
  9. 高通android7.0刷机工具使用介绍
  10. 硬件设计--阻抗匹配
  11. 王春亮推拿学堂:如何成为一名高级调理师
  12. [转载]GMT地形数据总结
  13. CVE-2017-0199漏洞分析
  14. 35岁鹅厂员工失业后嚎啕大哭...年轻新鹅分享省钱秘诀,每月除了房租水电,其他吃喝玩乐基本白嫖公司......
  15. PC端视频中语音实时转文字
  16. iOS - 内存管理
  17. Mysql主从(主从不同步解决办法,常见问题及解决办法)
  18. 2016年之年中总结
  19. signature=a95d3b624ea7b2de0432eee0b4f584d9,Braves mourn Hank Aaron
  20. 数仓学习笔记(5)——数仓搭建(DWD层)

热门文章

  1. 个性化LIMS实验室系统对实验室人员的管理
  2. Mac卸载微信输入法方法
  3. 三维卫星地图java_google卫星地图地图矫正
  4. c/c++在数据结构中结构体和参数传递的问题
  5. 【pip指令】python安装本地下载好的安装包
  6. web3.0系列之分布式存储IPFS
  7. 1227:Ride to Office(仔细想一想 很巧妙)
  8. IBM Power6、7配件FC号描述翻译(unix360.part08)
  9. zcmu-1139: 松哥的困惑V(思维~)
  10. Win7怎么删除Guest账户?