计算 fact(y) mod x

题面

已知

x = 11124440021748127159092076861405454814981575144744508857178576572929321435002942998531420985771090167262256877805902135304112271641074498386662361391760451
y = 11124440021748127159092076861405454814981575144744508857178576572929321435002942998531420985771090167262256877805902135304112271641074498386662361391661439

计算

y ! ( m o d x ) y!\pmod x y!(modx)

的值。

做法

通过米勒拉宾质数测试,不难发现 x x x 是质数,并且 x − y = 99012 x-y=99012 xy=99012 很小。根据威尔逊定理可知:

米勒拉宾素数测试

( x − 1 ) ! m o d    x = − 1 (x-1)!\mod x =-1 (x1)!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 (x1)(x2)(xt+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((x1)(x2)(xt+1))1

通过费马小定理计算 ( ( x − 1 ) ( x − 2 ) ⋯ ( x − t + 1 ) ) − 1 \left((x-1)(x-2)\cdots(x-t+1)\right)^{-1} ((x1)(x2)(xt+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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值