結果
| 問題 |
No.2120 場合の数の下8桁
|
| コンテスト | |
| ユーザー |
👑 Kazun
|
| 提出日時 | 2022-11-04 22:22:30 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 307 ms / 2,000 ms |
| コード長 | 1,337 bytes |
| コンパイル時間 | 140 ms |
| コンパイル使用メモリ | 82,176 KB |
| 実行使用メモリ | 75,648 KB |
| 最終ジャッジ日時 | 2024-07-18 20:16:41 |
| 合計ジャッジ時間 | 2,199 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 20 |
ソースコード
#拡張ユークリッドの互除法
def Extend_Euclid(a: int, b: int):
""" gcd(a,b) と ax+by=gcd(a,b) を満たす整数 x,y の例を挙げる.
[Input]
a,b: 整数
[Output]
(x,y,gcd(a,b))
"""
s,t,u,v=1,0,0,1
while b:
q,a,b=a//b,b,a%b
s,t=t,s-q*t
u,v=v,u-q*v
return s,u,a
def Modulo_Inverse(a, m):
""" (mod m) における逆元を求める.
Args:
a (int): mod m の元
m (int): 法
Returns:
int: 可逆元が存在するならばその値, 存在しないのであれば -1
"""
h=Extend_Euclid(a,m)
return h[0]%m if h[2]==1 else -1
#==================================================
def solve():
M=int(input())
N=int(input())
if M<N:
return 0
N=min(N,M-N)
Mod=10**8
e2=0; e5=0; xi=1
for k in range(M,M-N,-1):
while k%2==0:
e2+=1
k//=2
while k%5==0:
e5+=1
k//=5
xi=(xi*k)%Mod
yi=1
for k in range(1,N+1):
while k%2==0:
e2-=1
k//=2
while k%5==0:
e5-=1
k//=5
yi=(yi*k)%Mod
return pow(2,e2,Mod)*pow(5,e5,Mod)*xi*Modulo_Inverse(yi,Mod)%Mod
#==================================================
print(str(solve()).zfill(8))
Kazun