結果
| 問題 |
No.2798 Multiple Chain
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-06-28 22:01:46 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 174 ms / 2,000 ms |
| コード長 | 1,963 bytes |
| コンパイル時間 | 145 ms |
| コンパイル使用メモリ | 82,312 KB |
| 実行使用メモリ | 128,380 KB |
| 最終ジャッジ日時 | 2024-06-28 22:01:57 |
| 合計ジャッジ時間 | 9,776 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 51 |
ソースコード
import random
import math
from collections import deque,Counter
def is_prime(n:int)->bool:
if n%2==0:
return n==2
if n<=1:
return False
d=n-1
s=0
while (d&1)==0:
d>>=1
s+=1
if n<4759123141:
for a in (2,7,61):
if a==n:
continue
power=pow(a,d,n)
if power!=1:
for r in range(s+1):
if r==s:
return False
if power==n-1:
break
power=(power*power)%n
else:
for a in (2,325,9375,28178,450775,9780504,1796265022):
power=pow(a,d,n)
if power!=1:
for r in range(s+1):
if r==s:
return False
if power==n-1:
break
power=(power*power)%n
return True
def prime_fact(n:int):
ret=[]
for i in range(2,100):
while n%i==0:
ret.append(i)
n=n//i
if n==1:
return ret
calc=deque([n])
while len(calc)>0:
n=calc.pop()
while not is_prime(n):
x=random.randint(0,n-1)
y=x
c=random.randint(1,n-1)
i=0
while True:
x=(x*x+c)%n
y=(y*y+c)%n
y=(y*y+c)%n
d=math.gcd(abs(x-y),n)
if d==1:
i+=1
else:
if d!=n and d!=n:
calc.append(d)
n//=d
break
ret.append(n)
return sorted(ret)
dp=[[0]*1001 for i in range(1001)]
N=int(input())
fact=Counter(prime_fact(N))
dp[0][0]=1
for i in range(1,1001):
for j in range(1001):
if j-i>=0:
dp[i][j]=dp[i-1][j]+dp[i][j-i]
else:
dp[i][j]=dp[i-1][j]
ans=1
for i in fact:
ans*=dp[1000][fact[i]]
print(ans)