题面
已知
x = 11124440021748127159092076861405454814981575144744508857178576572929321435002942998531420985771090167262256877805902135304112271641074498386662361391760451
y = 11124440021748127159092076861405454814981575144744508857178576572929321435002942998531420985771090167262256877805902135304112271641074498386662361391661439
计算
y ! ( m o d x ) y!\pmod x y!(modx)
的值。
做法
通过米勒拉宾质数测试,不难发现 x x x 是质数,并且 x − y = 99012 x-y=99012 x−y=99012 很小。根据威尔逊定理可知:
( x − 1 ) ! m o d x = − 1 (x-1)!\mod x =-1 (x−1)!modx=−1
变形,记 t = 99012 t = 99012 t=99012:
( x − 1 ) ( x − 2 ) ⋯ ( x − t + 1 ) y ! m o d x = − 1 (x-1)(x-2)\cdots(x-t+1)y!\mod x = -1 (x−1)(x−2)⋯(x−t+1)y!modx=−1
因此:
y ! m o d x = − 1 ⋅ ( ( x − 1 ) ( x − 2 ) ⋯ ( x − t + 1 ) ) − 1 y!\mod x = -1\cdot\left((x-1)(x-2)\cdots(x-t+1)\right)^{-1} y!modx=−1⋅((x−1)(x−2)⋯(x−t+1))−1
通过费马小定理计算 ( ( x − 1 ) ( x − 2 ) ⋯ ( x − t + 1 ) ) − 1 \left((x-1)(x-2)\cdots(x-t+1)\right)^{-1} ((x−1)(x−2)⋯(x−t+1))−1 即可。
代码
x = 11124440021748127159092076861405454814981575144744508857178576572929321435002942998531420985771090167262256877805902135304112271641074498386662361391760451
y = 11124440021748127159092076861405454814981575144744508857178576572929321435002942998531420985771090167262256877805902135304112271641074498386662361391661439
left = 1 # 从 x-1 乘到 y+1
for i in range(1, t):
left *= (x - i)
left %= x
def qpow(A, B, P): # 快速幂
ans = 1
mul = A % P
while (B != 0):
if((B & 1) == 1):
ans *= mul
ans %= P
B >>= 1
mul *= mul
mul %= P
return ans
right = qpow(left, x - 2, x)
ans = (-right % x + x)%x
print(ans)
结果
10569944080090591401315432556965818857327680380269154543273468441025963038065648915158194147019839932524599260058098616377893091051396090650574162446875193