Codeforces 1188E - Problem from Red Panda(找性质+组合数学)
咦,题解搬运人竟是我?
一道很毒的计数题。
先转化下题意,每一次操作我们可以视作选择一种颜色并将其出现次数 \(+k\),之后将所有颜色的出现次数 \(-1\)。我们假设第 \(i\) 种颜色被操作了 \(c_i\) 次,那么一组 \(\{c_1,c_2,\cdots,c_k\}\) 符合条件当且仅当 \(\forall i,a_i+kc_i\ge\sum\limits_{i=1}^kc_i\)。我们所求即是符合这样的条件的 \(\{a_i-kc_i-\sum\limits_{i=1}^kc_i\}\) 的个数。
直接统计显然不行,因此考虑发掘一些性质。一个非常自然的猜想是,如果操作不能无限进行下去,那操作最多进行的轮数不会太多,大概就 \(\mathcal O(k)\) 级别的,因为如果存在一种操作序列满足 \(k\) 步之后仍然不会挂,那么我们一直重复这 \(k\) 次操作的过程中即可将游戏一直进行下去。因此从这个角度入手作文章。考虑对于一种颜色 \(i\),如果我们希望操作能够继续下去,那么必然有前 \(a_i+1+ck\) 次操作中必须至少有 \(c+1\) 次操作作用在这个颜色上,因此我们考虑将数轴上这些形如 \(a_i+1+ck(c\ge 0)\) 的位置打上 \(+1\) 标记,然后对整个数轴进行一遍前缀和,我们假设得到的前缀和数组为 \(s_i\),如果我们发现某个 \(s_i\) 大于 \(i\),那么我们显然没办法安排这 \(i\) 次操作符合限制,也就表明操作次数最多为 \(i-1\),break
掉即可。如果对于 \(i\in[1,k-1]\) 都不存在这样的情况则说明操作可以无限进行下去。
考虑怎样统计答案,首先是有限次操作的情况。需要注意到一个性质,那就是对于所有 \(x,y\in[1,k-1]\),如果 \(x\ne y\),那么所有操作 \(x\) 次后得到的序列肯定不同于操作 \(y\) 次后得到的序列,因为至少要 \(k\) 次操作可以将一个序列复原,而根据上面的推论,有限次操作的情况中操作次数的上界为 \(k-1\),因此我们考虑枚举操作次数 \(x\),那么我们考虑统计 \(x\) 次操作可以产生多少组不同的 \(\{c_1,c_2,\cdots,c_k\}\)。这个可以通过调用我们之前求得的前缀和数组 \(s_x\) 计算:有 \(s_x\) 次操作选择的颜色已经确定了,因此我们只能安排剩余 \(x-s_x\) 次操作选择的颜色,而这等价于 \(\sum\limits_{i=1}^kd_i=x-s_x\) 的非负整数解的组数,隔板法可算得方案数为 \(\dbinom{x-s_x+k-1}{k-1}\)。对于所有 \(x\) 计算一遍上式的值并将答案加起来即可。
接下来是无限次操作的情况。首先注意到一个性质,就是由于操作可以无限进行下去,对于任意 \(p\),如果一个序列 \(\{a'\}\) 可以通过 \(p\) 次操作得到,那序列 \(\{a'\}\) 也可以通过 \(p+k\) 次操作得到。但这个结论反过来不一定成立,因为可能存在 \(p\) 过小而导致某些颜色无法操作的情况。不过这个问题比较容易解决,如果 \(p>\max{a_i}\) 就不会存在步数过小而无法操作全部颜色的情况了。因此直接对 \(x\in[10^6+1,10^6+k]\) 重复一遍上面的过程即可。
时间复杂度 \(\mathcal O(\max\{a_i\}+k)\)。
const int MAXN=1e6;
const int MOD=998244353;
int n,a[MAXN+5],cnt[MAXN*2+5],fac[MAXN*3+5],ifac[MAXN*3+5];
void init_fac(int n){
for(int i=(fac[0]=ifac[0]=ifac[1]=1)+1;i<=n;i++) ifac[i]=1ll*ifac[MOD%i]*(MOD-MOD/i)%MOD;
for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%MOD,ifac[i]=1ll*ifac[i-1]*ifac[i]%MOD;
}
int binom(int x,int y){
if(x<0||y<0||x<y) return 0;
return 1ll*fac[x]*ifac[y]%MOD*ifac[x-y]%MOD;
}
int main(){
scanf("%d",&n);init_fac(MAXN*3);
int lim=n+MAXN,res=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
for(int j=a[i]+1;j<=lim;j+=n) cnt[j]++;
}
for(int i=1;i<=lim;i++){
cnt[i]+=cnt[i-1];
if(cnt[i]>i){lim=i-1;break;}
}
if(lim<=MAXN){
for(int i=0;i<=lim;i++) res=(res+binom(i-cnt[i]+n-1,n-1))%MOD;
} else {
for(int i=MAXN+1;i<=lim;i++) res=(res+binom(i-cnt[i]+n-1,n-1))%MOD;
}
printf("%d\n",res);
return 0;
}
Codeforces 1188E - Problem from Red Panda(找性质+组合数学)的更多相关文章
- Codeforces 1264F - Beautiful Fibonacci Problem(猜结论+找性质)
Codeforces 题面传送门 & 洛谷题面传送门 一道名副其实(beautiful)的结论题. 首先看到这道设问方式我们可以很自然地想到套用斐波那契数列的恒等式,注意到这里涉及到 \(F_ ...
- Codeforces 1383C - String Transformation 2(找性质+状压 dp)
Codeforces 题面传送门 & 洛谷题面传送门 神奇的强迫症效应,一场只要 AC 了 A.B.D.E.F,就一定会把 C 补掉( 感觉这个 C 难度比 D 难度高啊-- 首先考虑对问题进 ...
- Codeforces 1067E - Random Forest Rank(找性质+树形 dp)
Codeforces 题面传送门 & 洛谷题面传送门 一道不知道能不能算上自己 AC 的 D1E(?) 挺有意思的结论题,结论倒是自己猜出来了,可根本不会证( 开始搬运题解 ing: 碰到这样 ...
- Codeforces 809C - Find a car(找性质)
Codeforces 题目传送门 & 洛谷题目传送门 首先拿到这类题第一步肯定要分析题目给出的矩阵有什么性质.稍微打个表即可发现题目要求的矩形是一个分形.形式化地说,该矩形可以通过以下方式生成 ...
- Codeforces 1442D - Sum(找性质+分治+背包)
Codeforces 题面传送门 & 洛谷题面传送门 智商掉线/ll 本来以为是个奇怪的反悔贪心,然后便一直往反悔贪心的方向想就没想出来,看了题解才发现是个 nb 结论题. Conclusio ...
- Atcoder Grand Contest 008 E - Next or Nextnext(乱搞+找性质)
Atcoder 题面传送门 & 洛谷题面传送门 震惊,我竟然能独立切掉 AGC E 难度的思维题! hb:nb tea 一道 感觉此题就是找性质,找性质,再找性质( 首先看到排列有关的问题,我 ...
- Codeforces 1413F - Roads and Ramen(树的直径+找性质)
Codeforces 题目传送门 & 洛谷题目传送门 其实是一道还算一般的题罢--大概是最近刷长链剖分,被某道长链剖分与直径结合的题爆踩之后就点开了这题. 本题的难点就在于看出一个性质:最长路 ...
- Codeforces 526G - Spiders Evil Plan(长链剖分+直径+找性质)
Codeforces 题目传送门 & 洛谷题目传送门 %%%%% 这题也太神了吧 storz 57072 %%%%% 首先容易注意到我们选择的这 \(y\) 条路径的端点一定是叶子节点,否则我 ...
- Codeforces 698F - Coprime Permutation(找性质)
Codeforces 题面传送门 & 洛谷题面传送门 u1s1 感觉这个 D1F 比某道 jxd 作业里的 D1F 质量高多了啊,为啥这场的 D 进了 jxd 作业而这道题没进/yun 首先这 ...
随机推荐
- 【机器学习基础】逻辑回归——LogisticRegression
LR算法作为一种比较经典的分类算法,在实际应用和面试中经常受到青睐,虽然在理论方面不是特别复杂,但LR所牵涉的知识点还是比较多的,同时与概率生成模型.神经网络都有着一定的联系,本节就针对这一算法及其所 ...
- 【UE4 设计模式】原型模式 Prototype Pattern
概述 描述 使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.如孙悟空猴毛分身.鸣人影之分身.剑光分化.无限剑制 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象, ...
- 安装pytorch后import torch显示no module named 'torch'
问题描述:在pycharm终端里通过pip指令安装pytorch,显示成功安装但是python程序和终端都无法使用pytorch,显示no module named 'torch'. 起因:电脑里有多 ...
- Noip模拟35 2021.8.10
考试题目变成四道了,貌似确实根本改不完... 不过给了两个小时颓废时间确实很爽(芜湖--) 但是前几天三道题改着不是很费劲的时候为什么不给放松时间, 非要在改不完题的时候颓?? 算了算了不碎碎念了.. ...
- OTA测试介绍
OTA 测试介绍 手机的无源测试和有源测试 当前在手机射频性能测试中越来越关注整机辐射性能的测试,这种辐射性能反映了手目前主要有两种方法对手机的辐射性能进行考察:一种是从天线是目前较为传统的天线测试方 ...
- 零基础入门该如何实现C 语言面向对象编程(很有帮助)
零基础如果更快更好的入门C语言,如何在枯燥的学习中找到属于自己的兴趣,如果把学习当成一种事务性的那以后的学习将会很难有更深入的进步,如果带着乐趣来完成学习那将越学越有意思这样才会让你有想要更深入学习的 ...
- 单片机stm32F103单片机晶振不起振的原因分析
这是我在做单片机最小系统板时候碰到的问题,之前虽然也做过相似的板子,可是未曾出现过无源晶振不起振的问题.下面是我在遇到问题后的一些检查,排除问题的过程.本人小菜鸟一个,文章中如有错误和不足,还望各位大 ...
- Linux Shell Here Document
Here Document 是一种有特殊用处的代码块,他使用IO重定向的形式记录了一段临时的文本或交互命令,并且把这些文本或命令 依次的传递给一个程序或一个命令,作为他运行时的标准输入. Here d ...
- flyway的使用
1.使用它之前先要了解一些概念: 版本:对数据库的每一次变更可称为一个版本. 迁移:Flyway把数据库结构从一个版本更新到另一个版本叫做迁移. 可用的迁移:Flyway的文件系统识别出来的迁移版本. ...
- 装了这几个IDEA插件,基本上一站式开发了!
前言 前几天有社区小伙伴私聊我,问我都用哪些IDEA插件,我的IDEA的主题看起来不错. 作为一个开源作者,每周要code大量的代码,提升日常工作效率是我一直追求的,在众多的IDEA插件中,我独钟爱这 ...