题目链接

loj2538

题解

比较明显的是,由于强化牌倍数大于\(1\),肯定是能用强化牌尽量用强化牌

如果强化牌大于等于\(k\),就留一个位给攻击牌

所以我们将两种牌分别排序,企图计算\(F(i,j)\)表示\(i\)张强化牌选出最强的\(j\)张的所有方案的倍数和

\(G(i,j)\)表示从\(i\)张攻击牌选出最强\(j\)张的所有方案的伤害和

那么

\[ans = \sum\limits_{i = 0}^{k - 1} F(i,i)G(m - i,k - i) + \sum\limits_{i = k}^{m} F(i,k - 1)G(m - i,1)
\]

所以我们只需计算出\(F\)和\(G\)

以\(F\)为例,我们枚举选出最后一张牌是什么

那么设\(f[i][j]\)表示用了\(i\)张强化牌,最后一张是\(j\)的倍数和

同样设\(g[i][j]\)表示用了\(i\)张攻击牌,最后一张是\(j\)的伤害和

那么有

\[f[i][j] = w_j\sum\limits_{x = 0}^{j - 1}f[i - 1][x]
\]

\[g[i][j] = w_j{j - 1 \choose i - 1} + \sum\limits_{x = 0}^{j - 1}g[i - 1][x]
\]

可用前缀和优化为\(O(n^2)\)

那么

\[F(x,y) = \sum\limits_{i = 0}^{n}f[y][i]{n - i \choose x - y}
\]

\[G(x,y) = \sum\limits_{i = 0}^{n}g[y][i]{n - i \choose x - y}
\]

总复杂度\(O(Tn^2)\)

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
using namespace std;
const int maxn = 3005,maxm = 100005,INF = 1000000000,P = 998244353;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
int n,m,K,fac[maxn],fv[maxn],inv[maxn];
int w1[maxn],w2[maxn];
int f[maxn][maxn],g[maxn][maxn];
int s[maxn];
void init(){
fac[0] = fac[1] = inv[0] = inv[1] = fv[0] = fv[1] = 1;
for (int i = 2; i <= 3000; i++){
fac[i] = 1ll * fac[i - 1] * i % P;
inv[i] = 1ll * (P - P / i) * inv[P % i] % P;
fv[i] = 1ll * fv[i - 1] * inv[i] % P;
}
}
inline int C(int n,int m){
if (n < m) return 0;
return 1ll * fac[n] * fv[m] % P * fv[n - m] % P;
}
inline int F(int x,int y){
if (x > n || x < y) return 0;
int re = 0;
for (int i = 0; i <= n; i++)
re = (re + 1ll * f[y][i] * C(n - i,x - y) % P) % P;
return re;
}
inline int G(int x,int y){
if (x > n || x < y) return 0;
int re = 0;
for (int i = 0; i <= n; i++)
re = (re + 1ll * g[y][i] * C(n - i,x - y) % P) % P;
return re;
}
inline bool cmp(const int& a,const int& b){
return a > b;
}
void work(){
sort(w1 + 1,w1 + 1 + n,cmp);
sort(w2 + 1,w2 + 1 + n,cmp);
for (int i = 0; i <= n; i++)
for (int j = 0; j <= n; j++)
f[i][j] = g[i][j] = 0;
f[0][0] = 1;
s[0] = 1;
for (int i = 1; i <= n; i++) s[i] = s[i - 1];
for (int i = 1; i <= n; i++){
for (int j = i; j <= n; j++){
f[i][j] = 1ll * w1[j] * s[j - 1] % P;
}
for (int j = 0; j < i; j++) s[j] = 0;
for (int j = i; j <= n; j++) s[j] = (s[j - 1] + f[i][j]) % P;
}
s[0] = 0;
for (int i = 1; i <= n; i++) s[i] = s[i - 1];
for (int i = 1; i <= n; i++){
for (int j = i; j <= n; j++){
g[i][j] = (1ll * w2[j] * C(j - 1,i - 1) % P + s[j - 1]) % P;
}
for (int j = 0; j < i; j++) s[j] = 0;
for (int j = i; j <= n; j++) s[j] = (s[j - 1] + g[i][j]) % P;
}
int ans = 0;
for (int i = 0; i <= min(n,m); i++){
int j = m - i; if (j < 0 || j > n) continue;
if (i < K){
ans = (ans + 1ll * F(i,i) * G(j,K - i) % P) % P;
}
else{
ans = (ans + 1ll * F(i,K - 1) * G(j,1) % P) % P;
}
}
printf("%d\n",ans);
}
int main(){
init();
int T = read();
while (T--){
n = read(); m = read(); K = read();
REP(i,n) w1[i] = read();
REP(i,n) w2[i] = read();
work();
}
return 0;
}

loj2538 「PKUWC2018」Slay the Spire 【dp】的更多相关文章

  1. LOJ2538. 「PKUWC2018」Slay the Spire【组合数学】

    LINK 思路 首先因为式子后面把方案数乘上了 所以其实只用输出所有方案的攻击力总和 然后很显然可以用强化牌就尽量用 因为每次强化至少把下面的牌翻一倍,肯定是更优的 然后就只有两种情况 强化牌数量少于 ...

  2. loj #2538. 「PKUWC2018」Slay the Spire

    $ \color{#0066ff}{ 题目描述 }$ 九条可怜在玩一个很好玩的策略游戏:Slay the Spire,一开始九条可怜的卡组里有 \(2n\) 张牌,每张牌上都写着一个数字\(w_i\) ...

  3. 【LOJ】#2538. 「PKUWC2018」Slay the Spire

    题解 由于强化卡都是大于1的,我们分析一下就会发现,尽可能多的用强化卡,至少用一张攻击卡,一定是每组卡牌的最优选择 所以我们把攻击卡和强化卡从大到小排序 我们设\(g[i][j]\)表示前i张卡牌里选 ...

  4. 「PKUWC2018」Slay the Spire

    题目链接 题意分析 这个题其实不是期望 就是一共有\(C_{2n}^m\)种情况 每一种情况选择\(k\)张牌 然后求最大攻击值的总和 我们考虑 当前抽出了选出了\(i\)张强化牌 \(m-i\)张攻 ...

  5. LOJ #2538. 「PKUWC 2018」Slay the Spire (期望dp)

    Update on 1.5 学了 zhou888 的写法,真是又短又快. 并且空间是 \(O(n)\) 的,速度十分优秀. 题意 LOJ #2538. 「PKUWC 2018」Slay the Spi ...

  6. loj2542 「PKUWC2018」随机游走 【树形dp + 状压dp + 数学】

    题目链接 loj2542 题解 设\(f[i][S]\)表示从\(i\)节点出发,走完\(S\)集合中的点的期望步数 记\(de[i]\)为\(i\)的度数,\(E\)为边集,我们很容易写出状态转移方 ...

  7. LOJ2542. 「PKUWC2018」随机游走【概率期望DP+Min-Max容斥(最值反演)】

    题面 思路 我们可以把到每个点的期望步数算出来取max?但是直接算显然是不行的 那就可以用Min-Max来容斥一下 设\(g_{s}\)是从x到s中任意一个点的最小步数 设\(f_{s}\)是从x到s ...

  8. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

  9. 「PKUWC2018」随机游走(min-max容斥+FWT)

    「PKUWC2018」随机游走(min-max容斥+FWT) 以后题目都换成这种「」形式啦,我觉得好看. 做过重返现世的应该看到就想到 \(min-max\) 容斥了吧. 没错,我是先学扩展形式再学特 ...

随机推荐

  1. 廖雪峰git教程学习笔记3

    commit是一串不便记忆的数字,为了方便记忆,引入tag,tag就跟HEAD一样,就像一个指针,指向commit,且指向是不能变得,一个commit就有一个tag 给当前分支下的当前commit打上 ...

  2. Hyperledger Fabric CA User’s Guide——概述(二)

    概述 下面的图表说明了如何将Hyperledger Fabric CA与总体的Hyperledger Fabric结构相匹配. 有两种方式与一种Hyperledger Fabric CA服务器进行交互 ...

  3. Vmware vSphere 开启嵌套虚拟化

    一.vSphere 6开启嵌套虚拟化 已通过vSphere Client创建一个名字为Centos 7的虚拟机,现在需要打开该虚拟机的嵌套虚拟化功能. 1.在Esxi 服务器上面开启ssh服务,并关闭 ...

  4. TensorFlow学习之路1-TensorFlow介绍

    TensorFlow是一个采用数据流图(data flow graphs),用于数据计算的开源软件库. 什么是数据流图? TensorFlow的数据流图是由“节点”(nodes)和“线”(edges) ...

  5. 工程能力之C4模型

    概述 刚在InfoQ上看到一篇介绍C4Model的文章,觉得这个模型设计的很赞,很有指导意义,做个简单的记录. Why,为什么需要架构图? ThoughtWorks中国 文章中有几句话我觉得很有道理, ...

  6. DockerCon2017前瞻 - Docker企业版体验

    DockerCon 2017将于四月17号在美国Austin召开.在去年DockerCon上,Docker公司一系列的发布吹响了进军企业市场的号角.今天,容器技术已经愈发成熟,被越来越多的企业所关注和 ...

  7. django_models后台管理myarya

    arya重点代码 # urls.py from django.urls import path,re_path,include from arya.service import v1 urlpatte ...

  8. 第31次Scrum会议(11/19)【欢迎来怼】

    一.小组信息 队名:欢迎来怼 小组成员 队长:田继平 成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/11/19 17:05~17:34,总计29min. 地 ...

  9. Hibernate笔记①--myeclipse制动配置hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JD ...

  10. 我的寒假C(C++)学习计划

    前言 要补缺加强C语言的想法由来已久,上学期因为种种原因,某些知识点学习得不是很理想,而且,许多地方也有加强的必要,所以这次布置的随笔可谓是来得恰到好处. 学习材料 C Primer Plus 师爷的 ...