设 p=299993,给定 n 个 [0,p−1] 中的整数对 (xi,yi),q 次询问,每次给定一个 [0,p−1] 中的整数 z,求满足以下条件的 [0,p−1] 中的整数对 (x,y) 的个数:
∏((x−xi)2+(y−yi)2)≡z(modp)
1≤n≤100,1≤q<p。
考虑找到模 p 域下的“虚数” t2≡−1(modp),然后应用平方差公式:(和的乘积化为乘积的乘积)
∏((x−xi)2+(y−yi)2)=∏((x−xi)2−(ty−tyi)2)=∏(x−xi+ty−tyi)(x−xi−ty+tyi)=∏((x+ty)−(xi+tyi))∏((x−ty)−(xi−tyi))
注意到有序对 (x,y) 和 (x+ty,x−ty) 构成双射,故仅需关心 x+ty 和 x−ty。
设 G(x)=∏(x−(xi+tyi)),H(x)=∏(x−(xi−tyi)),那么 F(2x+y,2tx−y)=G(x)H(y)。
所以只需要求有多少个 (x,y) 满足 G(x)H(y)=z。
一个个代入求出 G([0,p−1]) 和 H([0,p−1]),再做 FFT 即可。注意这里是 aibj 贡献到 cij,故需要对原根取对数。
感觉一下答案不会很大,所以直接做 NTT 也可以。