【纪中模拟2018.11.02】【JZOJ5945】昆特牌
题目链接:https://jzoj.net/senior/#main/show/5945
Limits
TL: 1e3ms ML:512Mb
Description
原本昆特牌中有$k$种卡牌和$n$种阵营,且每个阵营拥有的卡牌种数都是相等的。由于故障,卡牌数据被打乱了,每个阵营现在有$a_{i}$种卡牌。因为昆特牌即将迎来重大更新,每种牌的所属阵营并不重要,工程师只想尽快让每个阵营拥有相同数量的卡牌。由于数据库的结构原因,你每单位时间只能将一种牌向左边或右边相邻的一个阵营移动。问:最终的卡牌分布有多少种方案。两种方案不同当且仅当存在一种卡牌,它在两种方案中所属阵营不同。对$998244353$取模。
Input
第一行一个整数$T$,表示数据组数。接下来每组数据,第一行一个整数$n$,第二行$n$个数,第$i$个数为$a_{i}$ ,意义见题目描述
Ouput
$T$行,每行一个数表示答案。
Sample Input 1
3
3
2 1 3
3
1 2 3
3
3 2 1
Sample Ouput 1
3
9
9
Sample Explanation 1
对于该组数据,初始为$\{\{1,2\}\{3\}\{4,5,6\}\}$,移动结束后为$\{\{1,2\}\{3,4\}\{5,6\}\}$$,$$\{\{1,2\}\{3,6\}\{4,5\}\}$$,$$\{\{1,2\}\{3,5\}\{4,6\}\}$
Sample Input 2
4
3
8 1 0
4
5 0 1 2
4
0 4 0 0
4
1 1 6 0
Sample Ouput 2
1120
30
24
270
Data Constraint
保证输入合法,$n\mid{}k,\sum_{i=1}^{n}a_i=k$
数据点 | $k\le$ | $n\le$ | $T\le$ |
1,2 | 10 | 5 | 10 |
3,4 | 1000 | 100 | 10 |
5,6 | 4000 | 10 | 10 |
7~10 | 1000000 | 1000 | 500 |
Solution
考场上,笔者分析题面,回忆起经典贪心例题均分纸牌,认为此题同样可以线性贪心转移求解。
读入牌堆数$n$、牌堆状态$a$。设最终各牌堆卡牌数为$ave$,则设差序列$b, \forall{}i\in{}[1,n],b_{i}=a_{i}-ave$
规定操作方向为下界至上界,每次操作$i$牌堆后清零$b_{i}$。
考虑$b_{i}>0$时,将$i$牌堆中所有超出$ave$的牌移至$i+1$牌堆,方案数为$\lgroup^{a_{i}}_{b_{i}}\rgroup$。
若$b_{i}<0$,则将$i+1$牌堆中取出$-b_{i}$张牌,移至$i$牌堆。此时若$i+1$牌堆足够多,方案数为$C_{a_{i+1}}^{-b_{i}}$;若$i+1$牌堆不够多,考虑实际移动牌的过程中,为了一遍转移,一定会先将$i+1$牌堆补成刚刚好足够补充$i$牌堆的状态,再将$i$牌堆补齐,同时$a_{i+1}$变为$ave$,方案数为$C_{ave-b_{i}}^{-b_{i}}$。实现过程中,将计算方案的$C$下标取$max$即可。
核心思想如上。观察数据范围,$k\le{}4e3$时,可以用杨辉三角预处理组合数,时间复杂度$O(k^2+T*n)$;$k\le{}1e6$时,预处理阶乘及其乘法逆元,时间复杂度$O(k+T*n)$。
Code
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<ctime> 6 using namespace std; 7 typedef long long LL; 8 bool isnum(char ch){ 9 if('0'<=ch&&ch<='9') 10 return 1; 11 return 0; 12 } 13 char ch; 14 bool sign; 15 void read(int& x){ 16 sign=0; 17 for(ch=getchar();!isnum(ch);ch=getchar()) 18 if(ch=='-') 19 sign=1; 20 x=ch-'0'; 21 for(ch=getchar();isnum(ch);ch=getchar()) 22 x=(x<<3)+(x<<1)+ch-'0'; 23 if(sign) 24 x=-x; 25 } 26 void read(LL& x){ 27 sign=0; 28 for(ch=getchar();!isnum(ch);ch=getchar()) 29 if(ch=='-') 30 sign=1; 31 x=ch-'0'; 32 for(ch=getchar();isnum(ch);ch=getchar()) 33 x=(x<<3)+(x<<1)+ch-'0'; 34 if(sign) 35 x=-x; 36 } 37 char stk[23]; 38 int cnt; 39 void write(LL x){ 40 if(x==0){ 41 putchar('0'); 42 return ; 43 } 44 if(x<0){ 45 putchar('-'); 46 x=-x; 47 } 48 cnt=0; 49 while(x){ 50 stk[++cnt]=x%10+'0'; 51 x/=10; 52 } 53 int i; 54 for(i=cnt;i>=1;i--) 55 putchar(stk[i]); 56 } 57 int T,n; 58 LL a[1003]; 59 LL b[1003]; 60 const LL mod=998244353; 61 LL jc[1000003]; 62 LL jcr[1000003]; 63 LL qpow(LL a,LL b){ 64 a%=mod; 65 LL ans=1; 66 while(b){ 67 if(b&1) 68 ans=(ans*a)%mod; 69 a=(a*a)%mod; 70 b>>=1; 71 } 72 return ans; 73 } 74 LL x,y,z; 75 LL C(LL n,LL m){ 76 x=jc[n]; 77 y=(jcr[m]*jcr[n-m])%mod; 78 z=(x*y)%mod; 79 return z; 80 } 81 LL ans; 82 LL max(LL x,LL y){ 83 if(x>y) 84 return x; 85 return y; 86 } 87 int main(){ 88 freopen("gwent.in","r",stdin); 89 freopen("gwent.out","w",stdout); 90 read(T); 91 int i; 92 jc[0]=jcr[0]=1; 93 for(i=1;i<=1000000;i++) 94 jc[i]=(jc[i-1]*i)%mod; 95 jcr[1000000]=qpow(jc[1000000],mod-2); 96 for(i=1000000;i>=2;i--) 97 jcr[i-1]=(jcr[i]*i)%mod; 98 LL sum,ave; 99 while(T--){ 100 read(n); 101 for(i=1;i<=n;i++) 102 read(a[i]); 103 sum=0; 104 for(i=1;i<=n;i++) 105 sum+=a[i]; 106 ave=sum/n; 107 for(i=1;i<=n;i++) 108 b[i]=a[i]-ave; 109 ans=1; 110 for(i=1;i<n;i++) 111 if(b[i]>0){ 112 ans=(ans*C(a[i],b[i]))%mod; 113 //leap i sends, ans*=C(a[i],b[i]) 114 a[i+1]+=b[i]; 115 b[i+1]+=b[i]; 116 a[i]-=b[i]; 117 b[i]=0;//set leap i empty 118 } 119 else if(b[i]<0){ 120 ans=(ans*C(max(ave-b[i],a[i+1]),-b[i]))%mod; 121 /* 122 leap i gets. 123 if(a[i+1]>ave) 124 straight from i+1, ans*=C(a[i],-b[i]) 125 else 126 borrow from farther, ans*=C(ave-b[i],-b[i]) 127 */ 128 a[i+1]+=b[i]; 129 b[i+1]+=b[i]; 130 a[i]-=b[i]; 131 b[i]=0;//set leap i empty 132 } 133 write(ans); 134 putchar('\n');//plural data, dont forget \n 135 } 136 return 0; 137 }
View Code
Conclusion
笔者能力不够,无法证明该贪心策略(极可能是错误的)。欢迎各位前来拍砖。
转载于:https://www.cnblogs.com/Hansue/p/9922907.html
【纪中模拟2018.11.02】【JZOJ5945】昆特牌相关推荐
- jozj5945. 【NOIP2018模拟11.02】昆特牌
5945. [NOIP2018模拟11.02]昆特牌 Description 作为一个资深OIer,你被邀请到位于波兰的CDPR总部参观.但没想到你刚一到就遇到了麻烦.昆特牌的数据库发生了故障.原本昆 ...
- JZOJ5945. 【NOIP2018模拟11.02】昆特牌(gwent)
Description 作为一个资深OIer,你被邀请到位于波兰的CDPR总部参观.但没想到你刚一到就遇到了麻烦.昆特牌的数据库发生了故障.原本昆特牌中有 k种卡牌和n 种阵营,为了平衡,每个阵营拥有 ...
- JZOJ-senior-5945. 【NOIP2018模拟11.02】昆特牌(gwent)
Time Limits: 1000 ms Memory Limits: 524288 KB Detailed Limits Description 作为一个资深OIer,你被邀请到位于波兰的CDPR总 ...
- 从零开始的纪中生活(7.11~7.22)
文章目录 Day 0 早上 下午 晚上 Day 1 早上 下午 晚上 题解链接 Day 2 早上 下午 晚上 题解链接 Day 3 早上 下午 晚上 题解链接 Day 4 早上 下午 晚上 题解链接 ...
- 纪中模拟赛——接苹果
题目: 很少有人知道奶牛爱吃苹果.农夫约翰的农场上有两棵苹果树(编号为1和2),每一棵树上都长满了苹果.奶牛贝茜无法摘下树上的苹果,所以她只能等待苹果从树上落下.但是,由于苹果掉到地上会摔烂,贝茜必须 ...
- 2018.11.02 洛谷P2661 信息传递(拓扑排序+搜索)
传送门 按照题意模拟就行了. 先拓扑排序去掉不在环上面的点. 剩下的都是简单环了. 于是都dfsdfsdfs一遍求出最短的环就行. 代码: #include<bits/stdc++.h> ...
- 《惢客创业日记》2018.11.02(周五) “追梦大叔”的回忆
今天的大部分时间都用来设计自媒体的两个宣传图片,一个是<惢客创业日记>的长条简介图,放在每一篇日记的前面,让读者明白什么是惢客创业日记. 为什么要加这一张图呢?因为,我发现,<惢客创 ...
- Unity3d 在 twitter 转载(周报) 2018.11.10
选自过去1~2周的内容: https://twitter.com/unity3d 日文: Unity WebGL启动过程 Unity减少内存使用方法(主要是WebGL) 2) Shader: 决定扩展 ...
- 2018年暑假 纪中培训总结
感想 这个暑假在纪中过得挺充实的,劳逸结合,与同学们相处的很开心.算法也讲了很多,但是基本上都没听懂.在这里学习环境还是很不错的,纪中的同学也都很友善,在这里基本没遇到什么烦心事,每天都很开心. 来这 ...
最新文章
- html 逗号用什么替换,字符串用javascript数组中的逗号替换“↵”
- R语言ggplot2可视化左对齐两个可视化图像的画图区域(边缘)实战
- String[] arrayIP= null;的典型错误
- html5-Canvas绘图
- 女孩子学电脑进入IT行业有什么优势?
- 深入分析Flex [Bindable] 【转】
- Apollo自动驾驶入门课程第⑩讲 — 控制(下)
- java中Date和DateFormat、SimpleDateFormat类
- 国家广电总局:常规电视剧剧集正片时长不少于41分钟
- jxl导入Excel
- Internal table 备忘
- 浅谈虚拟桌面上线推广的最佳时机
- 华为html阅读器 权限,在iReader阅读器上登录华为阅读
- 扒一扒最近很火的被马云强东联手封杀性感女黑帽
- 仿豆果美食tableview的展开和收缩效果
- 《水浒传》108将的绰号(ZZ)
- php cache_expire,PHP session_cache_expire 会话函数
- 弘扬中华传统文化 讲好中国故事
- 【uView】picker 地区选择
- 二分法求解平方根注意点:
热门文章
- TCP的三次握手和四次分手过程详解
- Win10-14361系统Windows墨迹工作区的用途
- [MICCAI2019] Conv2Warp: An unsupervised deformable image registration with continuous convolution an
- android通知栏语言更改,关于android语言切换后通知栏显示的问题
- 逆序对计数问题(java实现)
- overleaf段落注释
- 混凝土搅拌站计算机控制系统,一种混凝土搅拌站自动控制系统
- 数据库原理-多值依赖
- JAVA快速排序过程图解(10步之内看懂)
- php 手机在网状态接口