CC's

Back

Alice 想要得到一个长度为 n 的序列,序列中的数都是不超过 m 的正整数,而且这 n 个数的和是 p 的倍数。

Alice 还希望,这 n 个数中,至少有一个数是质数。

Alice 想知道,有多少个序列满足她的要求。

1n109,1m2×107,1p1001 \leq n \leq 10 ^ 9, 1 \leq m \leq 2 \times 10 ^ 7, 1 \leq p \leq 100

分析#

这题做得很爽…

首先是一个套路,维护倍数可以转为维护当前和的模。因此如果递推的话,只需要100个状态,看起来是可做的。但是这个n的范围实在是有点,先列一下再说。

把2e7个数字全部模完,它们对答案的贡献只和剩余类有关。这样我们就能知道在和的模为a时有多少种方案能够凑到b了。得出递推方程

f(i,j)=0k<pf(i1,(jk)mod3)c(k)f(i,j)=\sum_{0 \leq k < p} f(i-1,(j-k) \mod 3)c(k)

其中c(k)c(k)是模为k的数有多少个。

至少有一个质数的条件转为无质数,从所有的c中扣去质数后再算一遍方案数,二者相减。

最后,关于n,这个公式能够用快速幂加速。

代码#

[???] Builds Sequences
https://astro-pure.js.org/blog/builds-sequences
Author Cheng Chen
Published at 2020年3月18日
Comment seems to stuck. Try to refresh?✨