上一次用到原根这个东西,应该是一年之前了吧……
所谓原根,就是指对于某个数字P,满足它的原根g,g的0~P-2次幂在模P的意义下互不相同,或者说g的1~P-1次幂在模P的意义下无不相同。一般来说,原根只能够进行枚举求解,但是由于原根一般较小(2或者3),所以可以接受。
对于本题,要求对于每一个数字ak计算在模P意义下,有多少个ai*aj等于ak。直接做显然是O(N^2)的,不能够满足条件。看到这个题目形式和数据范围,很容易往FFT等方向上想,但是这里的ai的范围是1e9级别,而且这个是乘法,直接FFT也是不行的。由于P满足是质数,所以我们考虑用原根。
我们令g为质数P的原根,那么对于一个数字ai,唯一存在一个数字bi,使得 。那么我们把所有的ai用这种形式表示,于是对于原本的式子ai*aj≡ak(mod P),有