题意:
小 X 有 n 种颜色的球,其中第 i 种颜色的球共有 ai
个,同色的球无法区分。定义第 l∼r 种颜色的混乱度 f(l,r)为:将第 l∼r 种颜色的所有球排成一排,总共的方案数对 p 取模后的值。小 X 想请你帮忙计算下列式子的值:
∑nl=1∑nr=lf(l,r)
题解:发现每次选球的贡献可以直接使用组合数计算。但是是 O(n3∗log2a[i])的,拿不到任何分数。
考虑枚举一个 i 把 j 向右边扩,发现原式子是组合数相乘,所以可行。这样子是 O(n2∗log2a[i]),也拿不到任何分数。
但是发现其实乘的组合数有很多是 0,于是可以在遇到第一个 0 以后跳出。可以通过子任务 1。
在子任务 2 和 3 中,可能出题人会构造出很多 0,导致组合数乘的有很多 1,使用上面的优化时间复杂度退化。把所有 0 缩成一个 0 即可解决这个问题,通过子任务 2
实际上,由于 kummer 定理,c(n+m,n) 含有 p 的幂次数量为 n+m 在 p 进制下的进位次数。于是每一次加到区间 (l,r) 时,其实就是在检查 a[l]+…+a[r] 在 p 进制下是否有进位。最多进位 p×位数次,所以最多扩展 p×位数次。这样时间复杂度有保证。
发现每次调用 lucas 定理太慢。实际上,每次调用 lucas 定理就是在它的 p 进制分拆下做组合数,于是可以在每次向右边扩展时顺便维护一下和在 p 进制的每一位值,即可快速判断是否要跳出以及快速计算组合数。可以获得 100 分。
代码:
3 条评论
boshi · 2019年10月30日 4:54 下午
请简述题意
rilisoft · 2019年11月5日 8:05 上午
已经加上
boshi · 2019年11月5日 8:56 上午
感谢