PKUWC Slay The Spire
题面链接
sol
好神啊。果然\(dp\)还是做少了,纪录一下现在的思维吧\(QAQ\)。
我们首先可以发现期望是骗人的,要不然他乘的是什么xjb玩意。
其实就是要求所有方案的最优方案和。
因为\(w_i\)是大于1的,所以能强化先强化,再从大往小打攻击牌。
那么我们枚举用了\(a\)张强化,\(b\)张攻击。
若\(a<k\),显然强化牌选完,攻击牌从大到小。
否则,选前\(k-1\)大的强化牌,再选最大的攻击牌。
我们如何做到最优呢,这里有一个套路,先排序,这样可以保证每一种方案这一定是最优的。
设\(f[i][j]\)表示用了\(i\)张强化牌最后一张是第\(j\)张的所有的方案的乘积。
设\(g[i][j]\)表示用了\(i\)张攻击牌最后一张是第\(j\)张的所有的方案的和。
注意我们是求所有的方案。
设\(F[i][j]\)表示取了\(i\)张强化牌,用了\(j\)张的方案的乘积。
设\(G[i][j]\)表示取了\(i\)张攻击牌,用了\(j\)张的方案的和。
那么有
\]
\]
一张强化牌都不能要的时候。\(F[x][y]=\binom{n}{x}\)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define gt getchar()
#define ll long long
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
inline int in()
{
int k=0;char ch=gt;
while(ch<'-')ch=gt;
while(ch>'-')k=k*10+ch-'0',ch=gt;
return k;
}
const int N=3005,YL=998244353;
inline int MO(const int &a){return a>=YL?a-YL:a;}
inline int ksm(int a,int k){int r=1;while(k){if(k&1)r=1ll*r*a%YL;a=1ll*a*a%YL,k>>=1;}return r;}
int f[N][N],g[N][N],a[N],b[N],sum[N],fac[N],fnv[N],n,m,k;
inline int C(int x,int y){return y>x?0:1ll*fac[x]*fnv[y]%YL*fnv[x-y]%YL;}
inline int qh(int x,int y)
{
if(y>x)return 0;if(!y)return C(n,x);
int res=0;
for(int i=1;i<=n;++i)
res=MO(res+1ll*f[y][i]*C(n-i,x-y)%YL);
return res;
}
inline int gj(int x,int y)
{
if(y>x)return 0;if(!y)return 0;
int res=0;
for(int i=1;i<=n;++i)
res=MO(res+1ll*g[y][i]*C(n-i,x-y)%YL);
return res;
}
int main()
{
fac[0]=fnv[0]=1;
for(int i=1;i<=3000;++i)fac[i]=1ll*fac[i-1]*i%YL;fnv[3000]=ksm(fac[3000],YL-2);
for(int i=3000;i>=1;--i)fnv[i-1]=1ll*fnv[i]*i%YL;
int t=in();
while(t--)
{
n=in(),m=in(),k=in();
for(int i=1;i<=n;++i)a[i]=in();
for(int i=1;i<=n;++i)b[i]=in();
std::sort(a+1,a+n+1,std::greater<int>());
std::sort(b+1,b+n+1,std::greater<int>());
for(int i=1;i<=n;++i)f[1][i]=a[i],sum[i]=MO(sum[i-1]+a[i]);
for(int i=2;i<=n;++i)
{
for(int j=1;j<=n;++j)f[i][j]=1ll*a[j]*sum[j-1]%YL;
for(int j=1;j<=n;++j)sum[j] =MO(sum[j-1]+f[i][j]);
}
for(int i=1;i<=n;++i)g[1][i]=b[i],sum[i]=MO(sum[i-1]+b[i]);
for(int i=2;i<=n;++i)
{
for(int j=1;j<=n;++j)g[i][j]=MO(1ll*b[j]*C(j-1,i-1)%YL+sum[j-1]);
for(int j=1;j<=n;++j)sum[j] =MO(sum[j-1]+g[i][j]);
}
int ans=0;
for(int a=0,t=std::min(n,m);a<=t;++a)
{
int b=m-a;if(b>n||b<0)continue;
ans=MO(ans+(a<k?1ll*qh(a,a)*gj(b,k-a)%YL:1ll*qh(a,k-1)*gj(b,1)%YL));
}
printf("%d\n",ans);
}
return 0;
}
PKUWC Slay The Spire的更多相关文章
- LOJ #2538. 「PKUWC 2018」Slay the Spire (期望dp)
Update on 1.5 学了 zhou888 的写法,真是又短又快. 并且空间是 \(O(n)\) 的,速度十分优秀. 题意 LOJ #2538. 「PKUWC 2018」Slay the Spi ...
- BZOJ 5467 Slay the Spire
BZOJ 5467 Slay the Spire 我的概率基础也太差了.jpg 大概就是这样,因为强化牌至少翻倍,所以打出的牌必定是全部的强化牌或者$k-1$个强化牌,然后剩余的机会打出最大的几个攻击 ...
- loj #2538. 「PKUWC2018」Slay the Spire
$ \color{#0066ff}{ 题目描述 }$ 九条可怜在玩一个很好玩的策略游戏:Slay the Spire,一开始九条可怜的卡组里有 \(2n\) 张牌,每张牌上都写着一个数字\(w_i\) ...
- loj2538 「PKUWC 2018」Slay the Spire
pkusc 快到了--做点题涨涨 rp. ref我好菜啊QAQ. 可以发现期望只是一个幌子.我们的目的是:对于所有随机的选择方法(一共 \(\binom{2n}{m}\)种),这些选择方法都最优地打出 ...
- [LOJ #2538][PKUWC 2018]Slay the Spire
题目大意:一开始有 $2n$ 张牌,每张牌上都写着一个数字 $w_i$,有两种的牌,每种类型各 $n$ 张: 1.攻击牌:打出后对对方造成牌上的数字的伤害. 2.强化牌:打出后,设数字为 $x$,则其 ...
- 【loj2538】 【PKUWC 2018】Slay the Spire dp
我们不难发现,假设抽了x张攻击牌,y张强化牌,那么肯定是打出尽可能多张的强化牌后,再开始出攻击牌(当然最少要一张攻击牌) 我们设G(i,j)表示:所有(抽到的攻击牌牌数为i,打出的攻击牌牌数为j)的方 ...
- BZOJ.5467.[PKUWC2018]Slay the Spire(DP)
LOJ BZOJ 洛谷 哪张能力牌能乘攻击啊,太nb了叭 显然如果有能力牌,那么应该选最大的尽可能的打出\(k-1\)张. 然后下面说的期望都是乘总方案数后的,即所有情况的和.然后\(w_i\)统一用 ...
- [PKUWC2018] Slay the spire
Description 现在有 \(n\) 张强化牌和 \(n\) 张攻击牌: 攻击牌:打出后对对方造成等于牌上的数字的伤害. 强化牌:打出后,假设该强化牌上的数字为 \(x\),则其他剩下的攻击牌的 ...
- 题解-PKUWC2018 Slay the Spire
Problem loj2538 Solution 在考场上当然要学会写暴力,考虑如果手上已经有了\(a\)张攻击牌和\(b\)张强化牌: 首先强化牌会在攻击牌之前用(废话),其次要将两种牌分别从大往小 ...
随机推荐
- UnityShader学习笔记1 — — 入门知识整理
注:资料整理自<Unity Shader入门精要>一书 一.渲染流程概念阶段: 应用阶段:(1)准备好场景数据:(如摄像机位置,物体以及光源等) (2)粗粒度剔除(Culling): ...
- 多个EXCEL文件合并成一个
Python的numpy处理起来会比较方便,有空实现一下,这里是Excel内部代码的方式: 合并方法如下: 1.需要把多个excel表都放在同一个文件夹里面,并在这个文件夹里面新建一个excel.如图 ...
- windows离线补丁包下载路径-云盾安骑士
我们有一台阿里云服务器,只有内网可以访问,无外网资源. 阿里云账户邮箱反复收到阿里云云盾的漏洞报警通知,推荐安装安骑士组件. 安骑士组件是收费服务.阿里云服务器,无法连上外网,无法自动安装补丁.需要将 ...
- day12生成器
迭代器 __iter__() 获取迭代器 __next__() 下一个 生成器 本质就是迭代器 两种方式写生成器 1. 生成器函数 2. 生成器表达式 生成器函数 函数内部有yield. yield返 ...
- trustbox文件破解
常见的破解方式,是要还原内容的二进制文件,删除加密壳部分的对应二进制数值,然后把剩下的内容保存下来,就实现了破解的任务. 淘宝破解链接:https://item.taobao.com/item.ht ...
- LeetCode 404. Sum of Left Leaves (C++)
题目: Find the sum of all left leaves in a given binary tree. Example: 3 / \ 9 20 / \ 15 7 There are t ...
- java实验三实验报告
一.实验内容 1. XP基础 2. XP核心实践 3. 相关工具 二.实验过程(本次试验是在自己电脑上完成,没有使用实验楼) (一)敏捷开发与XP 1.XP是以开发符合客户需要的软件为目标而产生的一种 ...
- 《 Spring1之第二次站立会议(重发)》
< 第二次站立会议(重发)> 昨天,我把找到的代码和协议资料等相关资料在团队里做了相应的汇报: 今天,我对自己找到的代码进行了相关的了解后,把它们在编译环境中进行了编译以及接着对代码进行逐 ...
- 第二篇——VC++简单随机四则运算
目标:编写最简单的四则运算,类似A+B=C: 想法:建立一个Win32控制台应用程序,A和B用随机数表示,运算符号用0~3的数字对应,然后计算并输出即可: 具体过程: 利用函数rand(),返回一个0 ...
- ARP 询问之 校级路由器的猫腻
前情 我为什么选定 172.17.174.73 这个 ip 来进行测试.戳前情 Scapy之ARP询问 前言 在一般家用路由器局域网下,进行 arp 广播,说:我是192.168.1.100,你们谁的 ...