inv(a) = ( p - p / a) * inv( p % a ) % p; (其中inv(i)表示i 的逆元)
证明
设 x = p % a,y = p / a; (y就是p/a的商, x就是p/a后的余数)
于是: x + y * a = p;
等式两边同时对p取余: (x + y * a)% p = 0;
去括号并移项:x % p = - y * a % p;
将a移至左边: inv (a) * x % p = - y % p;
inv(a) * x % p = (-y + p ) % p;
将x移至右边 inv(a) =( p - y ) * inv(x) % p;
将证明开始设的x,y值代入上面式子中,则有 inv(a) = ( p - p/a )*inv( p % a ) % p;
标程
#includeusingnamespacestd;
longlong inv[3000006];
int main(){
int n,p;
cin >> n >> p;
inv[1] = 1;
for(int i = 2;i<= n;i++){
inv[i] = (p - p/i) * inv[p%i] % p;
}
for(int i = 1;i<= n;i++){
scanf("%lld
",inv[i]);
}
return0;
}
希望此文能对你有所帮助。