cogs2080Asm_Def排兵布阵解题报告
来源:互联网 发布:淘宝店铺销售额查询 编辑:程序博客网 时间:2024/05/14 13:50
【题目描述】
医疗兵,滚过来!滚过来滚过来滚过来!”
“自己人!自己人!TM的别打了是自己人”
Asm.Def所带领的特种部队都是从全国各地最部队中挑选的,可以说全国最精锐的部队集合到了他这里。但是透明计算网络造反的突然,时间仓促,组建完部队后就立即出发了,并没有进行战术演练,配合相当生硬。
Asm.Def仔细研究了自己的阵型,找到了问题所在,比如说把突击部队和医疗兵位置布置的过远,不能及时吃血瓶。以及把前线部队放在了榴弹炮的攻击区域内。
Asm.Def的特种部队拥有k类兵种,第i类兵种有num(i)个单位。现在要求把他们排成一列。其中第i类兵种的最后一个人一定要排在第i+1类兵种的最后一个人的前面。现在问你有多少种排列方法。要求你输出对答案998244353(7×17×223+1,一个质数)取模后的值。
【输入格式】
第一行一个整数k,表示有k类兵种
第二行有k个整数,其中第i个整数表示num(i),为第i类兵种有num(i)人
【输出格式】
一行一个整数,为方案数对998244353取模后的值。
【样例输入】
32 2 1
【样例输出】
3
【提示】
样例解释
一共有下面3中排列的方法
1 2 1 2 3
1 1 2 2 3
2 1 1 2 3
数据范围
保证num(i)>0
40%的数据:所有兵种的总人数小于15
80%的数据:k <= 1000,所有兵种的总人数小于5000
100%的数据:k <= 100000, 所有兵种的总人数小于500000
【来源】
在此键入。
题解:留下每种兵种的最后一名 那么就成为了一个单调上升序列 考虑向这个序列里插入其他的士兵
那么第一种就只能插在序列的第一个元素之前
考虑其他的兵种 第i种兵的第j个人有sum(i-1)+j个位置可以去
同理这种兵其他的也可以计算出来 最后在除去重复方案(除以全排列)
但数据范围太大 取过模后不支持除法运算
用乘法逆元计算除得的答案
代码:
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const long long MOD=998244353;long long func[500010];int num[100010];inline void exgcd(long long a,long long b,long long &d,long long &x,long long &y){if(!b){d=a;x=1;y=0;}else {exgcd(b,a%b,d,y,x);y-=(a/b)*x;}}int main(){freopen("asm_formation.in","r",stdin);freopen("asm_formation.out","w",stdout);int n;scanf("%d",&n);int sum=0;for(int i=1;i<=n;i++){scanf("%d",&num[i]);sum+=num[i];}func[1]=1;for(int i=2;i<=sum;i++)func[i]=((func[i-1]%MOD)*(i%MOD))%MOD;long long ans=1;int now=num[1];for(int i=2;i<=n;i++){if(num[i]!=1){long long res=func[num[i]-1]*func[now];res%=MOD;long long tl=func[num[i]-1+now];long long x,y,d;exgcd(MOD,res,d,x,y);long long r=res/d,M=MOD/d;if(x>0){long long k=x/r;k++;y+=k*M;y%=MOD;}if(y<0){long long k=y/M;k++;y+=k*M;y%=MOD;}y*=tl;y%=MOD;ans=ans*y;ans%=MOD;//ans=(ans+MOD)%MOD;}now+=num[i];}cout<<ans<<endl;return 0;}
- cogs2080Asm_Def排兵布阵解题报告
- hdu 排兵布阵
- hdu1166排兵布阵
- hdu 1166 敌兵布阵 (解题报告)
- HDU1166 敌兵布阵 解题报告--线段树
- hdu 1166 敌兵布阵 解题报告
- Hdu 1166 敌兵布阵 解题报告
- 排兵布阵也模式
- Hdu 1166 排兵布阵
- 排兵布阵&&线段树
- hdu 1166 排兵布阵
- NYOJ 1274排兵布阵
- 排兵布阵 线段树
- 关于快排的解题报告
- 单词倒排(中级)解题报告
- 线段树——HDOJ 1166 敌兵布阵 解题报告
- 项目管理-5-排兵布阵
- hdu4539 排兵布阵 状态DP
- kubernetes学习记录(13)——网上集群基于CA签名安全设置的两种方式对比
- UVALive4128[Steam Roller] dijkstra+拆点
- 如何光看一张图就判断你家下不下雨?
- xmpp协议详解一:xmpp基本概念
- 欢迎使用CSDN-markdown编辑器
- cogs2080Asm_Def排兵布阵解题报告
- winform主窗体副窗体相互调用
- 第五篇:JAVA汉字转拼音
- TCP 的那些事儿(下)
- 【转】STM32F030Cxxx 没有SCB->VTOR,如何重定位向量表
- ListView的实现步骤
- 预测数值型数据:回归
- css伪元素实现图片水平垂直居中
- IOS 下输入中文没有触发 keyup,导致绑定不了数据