Codeforces 题面传送门 & 洛谷题面传送门

咦,题解搬运人竟是我?

一道很毒的计数题。

先转化下题意,每一次操作我们可以视作选择一种颜色并将其出现次数 \(+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(找性质+组合数学)的更多相关文章

  1. Codeforces 1264F - Beautiful Fibonacci Problem(猜结论+找性质)

    Codeforces 题面传送门 & 洛谷题面传送门 一道名副其实(beautiful)的结论题. 首先看到这道设问方式我们可以很自然地想到套用斐波那契数列的恒等式,注意到这里涉及到 \(F_ ...

  2. Codeforces 1383C - String Transformation 2(找性质+状压 dp)

    Codeforces 题面传送门 & 洛谷题面传送门 神奇的强迫症效应,一场只要 AC 了 A.B.D.E.F,就一定会把 C 补掉( 感觉这个 C 难度比 D 难度高啊-- 首先考虑对问题进 ...

  3. Codeforces 1067E - Random Forest Rank(找性质+树形 dp)

    Codeforces 题面传送门 & 洛谷题面传送门 一道不知道能不能算上自己 AC 的 D1E(?) 挺有意思的结论题,结论倒是自己猜出来了,可根本不会证( 开始搬运题解 ing: 碰到这样 ...

  4. Codeforces 809C - Find a car(找性质)

    Codeforces 题目传送门 & 洛谷题目传送门 首先拿到这类题第一步肯定要分析题目给出的矩阵有什么性质.稍微打个表即可发现题目要求的矩形是一个分形.形式化地说,该矩形可以通过以下方式生成 ...

  5. Codeforces 1442D - Sum(找性质+分治+背包)

    Codeforces 题面传送门 & 洛谷题面传送门 智商掉线/ll 本来以为是个奇怪的反悔贪心,然后便一直往反悔贪心的方向想就没想出来,看了题解才发现是个 nb 结论题. Conclusio ...

  6. Atcoder Grand Contest 008 E - Next or Nextnext(乱搞+找性质)

    Atcoder 题面传送门 & 洛谷题面传送门 震惊,我竟然能独立切掉 AGC E 难度的思维题! hb:nb tea 一道 感觉此题就是找性质,找性质,再找性质( 首先看到排列有关的问题,我 ...

  7. Codeforces 1413F - Roads and Ramen(树的直径+找性质)

    Codeforces 题目传送门 & 洛谷题目传送门 其实是一道还算一般的题罢--大概是最近刷长链剖分,被某道长链剖分与直径结合的题爆踩之后就点开了这题. 本题的难点就在于看出一个性质:最长路 ...

  8. Codeforces 526G - Spiders Evil Plan(长链剖分+直径+找性质)

    Codeforces 题目传送门 & 洛谷题目传送门 %%%%% 这题也太神了吧 storz 57072 %%%%% 首先容易注意到我们选择的这 \(y\) 条路径的端点一定是叶子节点,否则我 ...

  9. Codeforces 698F - Coprime Permutation(找性质)

    Codeforces 题面传送门 & 洛谷题面传送门 u1s1 感觉这个 D1F 比某道 jxd 作业里的 D1F 质量高多了啊,为啥这场的 D 进了 jxd 作业而这道题没进/yun 首先这 ...

随机推荐

  1. python的参数传递是值传递还是引用传递?都不是!

    [写在前面] 参考文章: https://www.cnblogs.com/spring-haru/p/9320493.html[偏理论,对值传递和引用传递作了总结] https://www.cnblo ...

  2. 远程设备管理opendx平台搭建-appium和adb的安装

    多年不见了,说起来也有3年了我又开始写博客了,这几年我还是没啥长进,还是干测试,但是测试行业的话,我已经成了一个测开了,也在搭建自己的测试网站 本系列文章讲述的是一个系列的第一部分,最终可以搭建一整套 ...

  3. 【UE4】GAMES101 图形学作业2:光栅化和深度缓存

    总览 在上次作业中,虽然我们在屏幕上画出一个线框三角形,但这看起来并不是那么的有趣.所以这一次我们继续推进一步--在屏幕上画出一个实心三角形,换言之,栅格化一个三角形.上一次作业中,在视口变化之后,我 ...

  4. 如何使用远程工具连接Linux服务器

    大家好,今天我想和大家分享一下Linux如何连接远程控制工具我们都知道,Linux是著名的开源服务器操作系统,而在运维工程师的实际工作当中,我们不大可能时时刻刻都在服务器本地操作.因此这时,我们要用远 ...

  5. LeetCode:动态规划

    动态规划 动态规划永远的神 这部分主要是学习了 labuladong 公众号中对于动态规划的讲解 刷了些 leetcode 题,在此做一些记录,不然没几天就忘光光了 题目 这部分内容直接上题目了,解题 ...

  6. [对对子队]会议记录5.15(Scrum Meeting2)

    今天已完成的工作 吴昭邦 ​ 工作内容:衔接循环指令系统,搭建第4关 ​ 相关issue:实现循环组件 ​ 相关签入:feat: 将模型加入第四关 第四关可以顺利通过 何瑞 ​ 工作内容:衔接循环指令 ...

  7. ssh后门反向代理实现内网穿透

    如图所示,内网主机ginger 无公网IP地址,防火墙只允许ginger连接blackbox.example.com主机 假如你是ginger的管理员root,你想要用tech主机连接ginger主机 ...

  8. 2021.9.21考试总结[NOIP模拟58]

    T1 lesson5! 开始以为是个无向图,直接不懂,跳去T2了. 之后有看了一眼发现可暴力,于是有了\(80pts\). 发现这个图是有拓扑序的,于是可以用拓扑排序找最长路径.先找原图内在最长路径上 ...

  9. 常用Java API:Math类

    求最值 最小值 Math.min(int a, int b) Math.min(float a, float b) Math.min(double a, doubleb) Math.min(long ...

  10. single-number leetcode C++

    Given an array of integers, every element appears twice except for one. Find that single one. Note: ...