Description

九条可怜在玩一个很好玩的策略游戏:Slay the Spire,一开始九条可怜的卡组里有2n张牌,每张牌上都写着一个
数字wi,一共有两种类型的牌,每种类型各n张:1.攻击牌:打出后对对方造成等于牌上的数字的伤害。2.强化牌
:打出后,假设该强化牌上的数字为x,则其他剩下的攻击牌的数字都会乘上x。保证强化牌上的数字都大于1。现
在九条可怜会等概率随机从卡组中抽出m张牌,由于费用限制,九条可怜最多打出k张牌,假设九条可怜永远都会采
取能造成最多伤害的策略,求她期望造成多少伤害。
假设答案为y,你只需要输出
(2n)!*y / (m!*(2n-m)!) Mod 998244353

Input

第一行一个正整数T表示数据组数
接下来对于每组数据:
第一行三个正整数n,m,k
第二行n个正整数wi,表示每张强化牌上的数值。
第三行n个正整数wi,表示每张攻击牌上的数值。
1<=k<=m<=2n<=3e3
1<=wi<=1e8
Σ2n <= 3e4

Output

输出T行,每行一个非负整数表示每组数据的答案。

Sample Input

2
2 3 2
2 3
1 2
10 16 14
2 3 4 5 6 7 8 9 10 11
1 2 3 4 5 6 7 8 9 10

Sample Output

19
253973805

感谢~
可以发现题目要求的期望是假的,乘上的那个相当于一个总方案数
也就是说只要求出所有抽m张牌的产生的总和即可
再进一步分析题目,发现强化卡>=1的性质使得必定是先尽量用强化卡
设强化卡的数量为i
当$i<k$时,有多少用多少,接下来再用最大的$k-i$张攻击卡
当$i>k$时,用$k-1$张强化卡,再用一张最大的攻击卡
我们找最优取法,再乘上这个取法出现的次数即可
设$F(i,j)$为用了$i$张强化卡,其中最大的是第$j$大的,所有取法的乘积的和
设$G(i,j)$为用了$i$张攻击卡,其中最大的是第$j$大的,所有取法的和的和
那么若抽m张中有x张是强化卡,最优策略会用掉y张,则有
$\sum\limits_i \sum\limits_j f_{y,i} \times g_{k-y,j} \times C_{n-i}^{x-y} \times C_{n-j}^{m-x-(k-y)}$
我们用$f(i,j)$表示用了$i$张强化卡,其中最大的小于等于第$j$大的,所有取法的乘积的和
可也得出$f(i,j)=f(i-1,j-1)*w[j]+f(i,j-1)$,$F(i,j)=f(i,j)-f(i,j-1)$
G的处理类似
而对于上面的那组求和公式,因为满足乘法分配律
其实我们可以对$f$和$g$分别求和,再乘到一起,效果是一样的
再代码中我们可以对种觉察情况分别求和,再加到一起

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define N 3005
 4 #define ll long long
 5 #define mod 998244353
 6 using namespace std;
 7 int T;
 8 ll n,m,k;
 9 ll fac[N],inv[N],c[N][N],ans,f[N][N],g[N][N];
10 ll w[2][N];
11 ll ksm(ll x,ll t){
12     ll ans=1;
13     for(;t;t>>=1,x=(x*x)%mod)if(t&1)ans=(ans*x)%mod;
14     return ans;
15 }
16 inline void pre(){
17     fac[0]=1;for(int i=1;i<=3000;i++)fac[i]=(fac[i-1]*i)%mod;
18     inv[3000]=ksm(fac[3000],mod-2);
19     for(int i=2999;i>=0;i--)inv[i]=inv[i+1]*(i+1)%mod;
20     c[0][0]=1;
21     for(int i=1;i<=3000;i++)
22     for(int j=0;j<=i;j++)
23     c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
24     for(int i=0;i<=3000;i++)f[0][i]=1;
25 }
26 bool cmp(int a,int b){return a>b;}
27 int main(){
28     pre();
29     scanf("%d",&T);
30     while(T--){
31         scanf("%lld%lld%lld",&n,&m,&k);
32         for(int i=1;i<=n;i++)scanf("%lld",&w[0][i]);
33         for(int i=1;i<=n;i++)scanf("%lld",&w[1][i]);
34         sort(w[0]+1,w[0]+n+1,cmp);
35         sort(w[1]+1,w[1]+n+1,cmp);
36         ans=0;
37         for(int i=1;i<=n;i++)
38         for(int j=1;j<=n;j++){
39             f[i][j]=(1ll*f[i-1][j-1]*w[0][j]+f[i][j-1])%mod;
40             g[i][j]=(g[i-1][j-1]+1ll*(c[j][i]-c[j-1][i]+mod)*w[1][j]+g[i][j-1])%mod;
41         }
42         for(int i=0;i<k;i++){
43             ll sum1=f[i][n],sum2=0;
44             for(int j=k-i;n-j>=m-k;j++)
45             sum2=(sum2+1ll*(g[k-i][j]-g[k-i][j-1]+mod)*fac[n-j]%mod*inv[m-k]%mod*inv[n-j-(m-k)])%mod;
46             ans=(ans+sum1*sum2)%mod;
47         }
48         for(int i=k;i<m;i++){
49             ll sum1=0,sum2=0;
50             for(int j=k-1;n-j>=i-(k-1);j++)
51             sum1=(sum1+1ll*(f[k-1][j]-f[k-1][j-1]+mod)*fac[n-j]%mod*inv[i-(k-1)]%mod*inv[n-j-(i-(k-1))])%mod;
52             for(int j=1;n-j>=m-i-1;j++)
53             sum2=(sum2+1ll*(g[1][j]-g[1][j-1]+mod)*fac[n-j]%mod*inv[m-i-1]%mod*inv[n-j-(m-i-1)])%mod;
54             ans=(ans+sum1*sum2)%mod;
55         }
56         printf("%lld\n",ans);
57     }
58     return 0;
59 }

View Code

这道题我在LOJ上WA的时候发现w数组开成了w[0][N],然而这样的码还能A掉BZ上的数据

感到十分震惊并认为其中有鬼23333

转载于:https://www.cnblogs.com/2017SSY/p/10291510.html

LOJ#2538. 「PKUWC2018」Slay the Spire相关推荐

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

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

  2. 「PKUWC2018」Slay the Spire

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

  3. LOJ#2542. 「PKUWC2018」随机游走

    LOJ#2542. 「PKUWC2018」随机游走 题目描述 Solution 去过一个点集中所有节点的期望时间不好求,考虑min−maxmin-maxmin−max容斥,转化为求第一次到达某一个点集 ...

  4. LOJ 2537 「PKUWC2018」Minimax

    BZOJ 5461. 线段树合并优化$dp$. 假设所有离散之后的权值$\in [1, m]$,对于一个点$x$它的权值是$i$的概率是$f(x, i)$,那么 1.假如这个点只有一个儿子$y$,那么 ...

  5. loj#2542. 「PKUWC2018」随机游走(MinMax容斥 期望dp)

    题意 题目链接 Sol 考虑直接对询问的集合做MinMax容斥 设\(f[i][sta]\)表示从\(i\)到集合\(sta\)中任意一点的最小期望步数 按照树上高斯消元的套路,我们可以把转移写成\( ...

  6. loj#2541. 「PKUWC2018」猎人杀

    传送门 思路太清奇了-- 考虑容斥,即枚举至少有哪几个是在\(1\)号之后被杀的.设\(A=\sum_{i=1}^nw_i\),\(S\)为那几个在\(1\)号之后被杀的人的\(w\)之和.关于杀了人 ...

  7. Loj #3111. 「SDOI2019」染色

    Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色 ...

  8. Loj #3055. 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

  9. LOJ#2230. 「BJOI2014」大融合

    LOJ#2230. 「BJOI2014」大融合 题目描述 小强要在$N$个孤立的星球上建立起一套通信系统.这套通信系统就是连接$N$个点的一个树.这个树的边是一条一条添加上去的. 在某个时刻,一条边的 ...

  10. loj#2143. 「SHOI2017」组合数问题

    loj#2143. 「SHOI2017」组合数问题 题目描述 Solution 考虑转化一下我们要求的东西. ∑i=0n(nkik+r)=∑i=0n(nki)[i≡r(modk)]\sum_{i=0} ...

最新文章

  1. 用上AI后,银行每年竟然能多赚1万亿美元丨麦肯锡最新调查报告
  2. python算法与程序设计基础第二版-算法与程序设计基础(Python版) - 吴萍
  3. 动态代理案例1:运用Proxy动态代理来增强方法
  4. Python虚拟环境virtualenv的安装与使用详解(转)
  5. PasswordEncoder详解
  6. Focal loss及其实现
  7. Shadow Map在DirectX9.0 SDK Sample 的实现方法
  8. MFC中 给基于CFormView的单文档添加背景图片
  9. POJ2083-Fractal
  10. android开发学习——day3
  11. mysql里的char和varchar
  12. 智能车学习(十四)——K60单片机GPIO学习
  13. ESP32核心原理图
  14. datasupport类删除_reiserfs文件系统反删除(Undelete)数据恢复操作的实践
  15. 领导力与团队管理上课笔记--上
  16. 完全教程 Aircrack-ng破解WEP、WPA-PSK加密利器[zz]
  17. MVP结合(RecycleView,Retorfit,GreenDao和EventBus)数据展示
  18. PhpStorm修改字体和主题
  19. 经典算法之贪心(Greedy)
  20. python期末大作业 邮箱小程序

热门文章

  1. 塔防三国志服务器维护时间,《塔防三国志》停服公告
  2. 百度排名靠前工具软件
  3. Pytorch踩坑记:赋值、浅拷贝、深拷贝三者的区别以及model.state_dict()和model.load_state_dict()的坑点
  4. 美国学生债务数据 csv_我如何摆脱学生债务陷阱,为什么其他美国人不那么幸运...
  5. nova evacuate功能分析
  6. html动态工艺流程,化工工艺动态流程图制作软件
  7. OpenGL FBO学习
  8. java实现word转换pdf并批量生成水印
  9. Javaweb安全——JSP Webshell
  10. seurat质控Warning: Feature names cannot have underscores (‘_‘), replacing with dashes (‘-‘)