結果
問題 | No.2318 Phys Bone Maker |
ユーザー | flygon |
提出日時 | 2023-05-26 22:24:44 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,130 ms / 3,000 ms |
コード長 | 1,423 bytes |
コンパイル時間 | 548 ms |
コンパイル使用メモリ | 82,048 KB |
実行使用メモリ | 78,848 KB |
最終ジャッジ日時 | 2024-12-25 08:10:47 |
合計ジャッジ時間 | 12,697 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 45 |
ソースコード
import sys sys.setrecursionlimit(5*10**5) input = sys.stdin.readline from collections import defaultdict, deque, Counter from heapq import heappop, heappush from bisect import bisect_left, bisect_right from math import gcd n = int(input()) mod = 998244353 def fact(n): l = set() for i in range(1,int(pow(n,0.5))+1): if n % i == 0: l.add(i) l.add(n//i) return sorted(list(l)) def pfact(n): l = [] tmp = n for i in range(2,int(pow(n,0.5))+1): if tmp % i == 0: cnt = 0 while tmp % i == 0: cnt += 1 tmp //= i l.append([i,cnt]) if tmp != 1: l.append([tmp,1]) return l fn = fact(n) pp = [i for i,j in pfact(n)] d = [[0]*(len(pp)) for i in range(len(fn))] for i in range(len(fn)): now = fn[i] for j in range(len(pp)): while now % pp[j] == 0: d[i][j] += 1 now //= pp[j] cnt = defaultdict(int) for i in range(len(fn)): tmp = 1 for j in range(len(pp)): tmp *= d[i][j] + 1 cnt[fn[i]] = tmp dp = [1]*(len(fn)) for i in range(1,len(fn)): for j in range(i+1,len(fn)): if fn[j] % fn[i] != 0: continue tmp = fn[j] // fn[i] tmp = 1 for k in range(len(pp)): if d[i][k] == d[j][k]: tmp *= d[i][k] + 1 dp[j] += dp[i] * tmp dp[j] %= mod print(dp[-1])