51nod

如果不考虑升级操作,只有买装备操作和打怪操作,那么首先一定要先买装备,然后可以打死1级的怪,这些怪被打死的时间只要在第一次买装备后面好了,因为现在总操作是\(n+\sum a_i\)个,所以这里的方案数为\(\binom{n-1+\sum_{i=1}a_i}{a_1}a_1!\).然后考虑买第二个装备,这个操作的位置显然在前面操作放完后的剩下的空位中的第一个,然后就有\(a_2\)个怪要打,方案为\(\binom{n-2+\sum_{i=2}a_2}{a_1}a_2!\),容易发现每考虑完\(i\),就剩下一个怪等级为\(i+1\)到\(n\)子问题,所以这个问题答案就是\(n\)个组合数相乘,具体来说是\(\prod_{i=1}^{n}\binom{n-i+\sum_{j=i}a_j}{a_i}a_i!\)

然后考虑有升级操作,那么买第\(i\)个装备就至少要升\(i\)次级,考虑dp,设\(f_{i,j}\)表示升\(i\)次级以及买\(j\)次装备的方案,显然要满足\(i\ge j\),转移就枚举现在升级还是买装备,如果买装备就要考虑这个等级的怪怎么打,也就是乘上一个类似于上面的组合数,就是从剩下的空位选\(a_j\)个打怪并考虑打怪顺序.答案为\(f_{n,n}\)

#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db double using namespace std;
const int N=5000+10,M=N*N,mod=998244353;
int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
void ad(int &x,int y){x+=y,x-=x>=mod?mod:0;}
int fpow(int a,int b){int an=1;while(b){if(b&1) an=1ll*an*a%mod;a=1ll*a*a%mod,b>>=1;} return an;}
int ginv(int a){return fpow(a,mod-2);}
int n,tt,a[N],s[N],f[N][N];
int fac[M],iac[M];
int C(int a,int b){return b<0||a<b?0:1ll*fac[a]*iac[b]%mod*iac[a-b]%mod;} int main()
{
n=rd();
tt=n+n;
for(int i=1;i<=n;++i)
{
a[i]=rd();
tt+=a[i],s[i]=s[i-1]+a[i];
}
fac[0]=1;
for(int i=1;i<=tt;++i) fac[i]=1ll*fac[i-1]*i%mod;
iac[tt]=ginv(fac[tt]);
for(int i=tt;i;--i) iac[i-1]=1ll*iac[i]*i%mod;
f[0][0]=1;
for(int i=0;i<=n;++i)
for(int j=0;j<=i;++j)
{
if(!f[i][j]) continue;
ad(f[i+1][j],f[i][j]);
if(j<i) ad(f[i][j+1],1ll*f[i][j]*C(tt-(i-m)-(j+1)-s[j],a[j+1])%mod*fac[a[j+1]]%mod);
}
printf("%d\n",f[n][n]);
return 0;
}

51nod 2589 快速讨伐的更多相关文章

  1. 【51nod】2589 快速讨伐

    51nod 2589 快速讨伐 又是一道倒着推改变世界的题... 从后往前考虑,设\(dp[i][j]\)表示还有\(i\)个1和\(j\)个\(2\)没有填,那么填一个1的话直接转移过来 \(dp[ ...

  2. 51nod 1013快速幂 + 费马小定理

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1013 这是一个等比数列,所以先用求和公式,然后和3^(n+1)有关,有n ...

  3. 51nod 矩阵快速幂(模板题)

    1113 矩阵快速幂  基准时间限制:3 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给出一个N * N的矩阵,其中的元素均为正整数.求这个矩阵的M次方.由于M次方的计算结果太大 ...

  4. 51nod 1113 矩阵快速幂

    题目链接:51nod 1113 矩阵快速幂 模板题,学习下. #include<cstdio> #include<cmath> #include<cstring> ...

  5. 51Nod 1004 n^n的末位数字(日常复习快速幂,莫名的有毒,卡mod值)

    1004 n^n的末位数字 题目来源: Author Ignatius.L (Hdu 1061) 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 给出一个整数N,输出 ...

  6. 51Nod 1046 A^B Mod C(日常复习快速幂)

    1046 A^B Mod C 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出3个正整数A B C,求A^B Mod C. 例如,3 5 8,3^5 Mod 8 = ...

  7. 51nod 1835 - 完全图 - [dp][组合数公式][快速幂]

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1835 基准时间限制:1 秒 空间限制:131072 KB   ...

  8. 51Nod 快速傅里叶变换题集选刷

    打开51Nod全部问题页面,在右边题目分类中找到快速傅里叶变换,然后按分值排序,就是本文的题目顺序. 1.大数乘法问题 这个……板子就算了吧. 2.美妙的序列问题 长度为n的排列,且满足从中间任意位置 ...

  9. 51nod 1013 3的幂的和 - 快速幂&除法取模

    题目地址:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1013 Konwledge Point: 快速幂:https:/ ...

随机推荐

  1. Unity3D_(插件)DOTween动画插件

    使用DOTween动画插件来实现物体的移动动画 Learn 一.DOTween插件对变量的动画 二.控制Cube和UI面板的动画 三.动画的快捷播放方式 四.动画的前放和后放 五.From Tween ...

  2. python-Django框架

    常用命令 生成应用 python manage.py start app(app_name) 开启服务器 python manage.py runserver 0.0.0.0:8001 声称以及修改数 ...

  3. 过滤器修改response

    过滤器通过doFilter方法的第二个参数ServletResponse将输出发送给客户,但servletResponse参数没有为过滤器提供servlet或jsp页面的访问:执行doFilter方法 ...

  4. HearthBuddy炉石兄弟 Method 'CollectionDeckBoxVisual.IsValid' not found.

    [CollectionManagerScene_COLLECTION] An exception occurred when calling CacheCustomDecks: System.Miss ...

  5. leetcode-easy-trees-102. Binary Tree Level Order Traversal-YES

    mycode  98.56% # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x ...

  6. leetcode 正则表达式匹配

    类似题目:通配符匹配 动态规划解法: 1. p[j] == s[i]: dp[i][j] = dp[i-1][j-1] 2. p[j] == ".": dp[i][j] = dp[ ...

  7. 使用relo

    安装好插件以后,选择一个工程,右键点击relo connection(如果已经连接了就不需要点击).点击navigate,open relo session,选择一个文件,可以打开这个文件的类图,点击 ...

  8. Sublime text3 Version 3.2.2, Build 3211破解

    一.修改hosts hosts地址: C:\Windows\System32\drivers\etc #sublimetext 127.0.0.1 www.sublimetext.com 127.0. ...

  9. android 面试汇总<一>

    1.1 Android Activity Q:说下Activity的生命周期? 技术点:Activity生命周期 思路:分条解释Activity从创建到销毁整个生命周期中涉及到的方法及作用 参考回答: ...

  10. TCP/IP,Http,Socket的区别

    大学学习网络基础的时候老师讲过,网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用 ...