这种题都还需要看题解,丢人。。。
考虑枚举每个数(v),求出网格中包含(v)的方案。
考虑正难则反,使用(r^n)减去网格中不包含(x)的方案。
这要求数列中不能存在两个数(a_x*a_y=v(mod p))
由于(p)是奇质数,所以每个数(a_x)会对应唯一的(a_y)。特别的,当(v=0),(0)和所有数互斥。
虽然(r)很大,但是(P)很小。我们只用关心所有数对(P)取模的值。
考虑把所有数按照对(P)取模的值分类。
则每个(<P)的数只可能出现(b)或者(b+1)次。
限制可以被变成:
某两个数(a_x,a_y)互斥,(a_x)有(b,b+1)种,(b_x)有(b,b+1)种选法。
考虑使用egf描述,当(a_x)有(b),(b_x)有(b)种选法。
还是考虑正难则反,求出任意-都选择的方案数,则生成函数是(e^{bx}e^{bx}-(e^{bx}-1)(e^{bx}-1)=e^{bx}+e^{bx}-1)
把相同的项写成幂次形式。
经过若干推导,发现答案可以使用(n![x^n](e^{bx}+e^{bx}-1)^{v0}(e^{bx}+e^{(b+1)x}-1)^{v1}(e^{(b+1)x}+e^{(b+1)x}-1)^{v2}e^{(r/P)x})表示
最后的(e^{(r/P)x})是考虑(0)的情况
如果暴力计算,则时间复杂度为(O(Pn^2))
发现本质不同的(v0,v1,v2)个数不会超过(sqrt{P}),记忆化即可。
时间复杂度(O(sqrt{P}n^2))