結果
| 問題 |
No.2120 場合の数の下8桁
|
| コンテスト | |
| ユーザー |
👑 Kazun
|
| 提出日時 | 2022-11-04 22:06:27 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,091 bytes |
| コンパイル時間 | 157 ms |
| コンパイル使用メモリ | 81,920 KB |
| 実行使用メモリ | 189,588 KB |
| 最終ジャッジ日時 | 2024-07-18 19:53:53 |
| 合計ジャッジ時間 | 4,003 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 6 TLE * 1 -- * 13 |
ソースコード
def Smallest_Prime_Factor(N):
""" 0,1,2,...,N の最小の素因数のリスト (0,1 については 1 にしている)
"""
if N<=1:
return [1]*(N+1)
T=[0]*(N+1); T[0]=T[1]=1
for i in range(2, N+1, 2):
T[i]=2
for i in range(3, N+1, 6):
T[i]=3
prime=[2,3]
i=5; d=2
while i<=N:
if T[i]==0:
T[i]=i
prime.append(i)
for p in prime:
if i*p<=N:
T[i*p]=p
else:
break
if p==T[i]:
break
i+=d; d=6-d
return T
#拡張ユークリッドの互除法
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
Mod=10**8
L=Smallest_Prime_Factor(M)
e2=0; e5=0; xi=1
for k in range(M,M-N,-1):
while k>1:
if L[k]==2:
e2+=1
elif L[k]==5:
e5+=1
else:
xi*=L[k]
xi%=Mod
k//=L[k]
f2=0; f5=0; yi=1
for k in range(1,N+1):
while k>1:
if L[k]==2:
f2+=1
elif L[k]==5:
f5+=1
else:
yi*=L[k]
yi%=Mod
k//=L[k]
return pow(2,e2-f2,Mod)*pow(5,e5-f5,Mod)*xi*Modulo_Inverse(yi,Mod)%Mod
#==================================================
print(str(solve()).zfill(8))
Kazun