http://hi.baidu.com/gzh19950711/item/9f1e6adfe8a8d037e3108f82
定义 a * x = 1(mod p), 求x
1、扩展欧几里德:
令ax + py = 1
Gcd的本质就是进行迭代,不断缩小范围。
不详细讲。。参考:http://baike.baidu.com/view/1478219.htm
2、根据费马小定理:若(a,p)互质,且p为质数:
则 a ^ (p – 1)= 1 (% p)
所以x = a ^ (p- 2) (% p)
快速幂求之,查询log(n),常数比扩展欧几里德稍大
3、O(n)预处理-O(1)询问
预处理1-n关于p的逆元:(n < p)
假设已经预处理了1-i-1的逆元,j的逆元设为F[j]
令p = x * i –y ( 0 < y < i)
X* i = y (mod p)
X* F[y] * i = y * F[y] = 1(mod p)
所以i的逆元是F[i] = X* F[y]
这样就可以O(n)的时间预处理了。
4、还有一种方法:
逆元函数是完全积性的。。所以求所有质数的逆元即可,预处理复杂度是O(n / logn * logn) = O(n)。。。
参考贾志鹏WC论文