結果

問題 No.3160 Party Game
ユーザー navel_tos
提出日時 2025-05-23 22:02:43
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 82 ms / 2,000 ms
コード長 3,183 bytes
コンパイル時間 456 ms
コンパイル使用メモリ 82,684 KB
実行使用メモリ 121,696 KB
最終ジャッジ日時 2025-05-27 22:05:21
合計ジャッジ時間 3,959 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 38
権限があれば一括ダウンロードができます

ソースコード

diff #

#yukicoder 3155- KCPC新歓杯

'''
#3155
import random
N = int(input())
birthday = [tuple(map(int, input().split())) for _ in range(N)]
birthday.sort()
print('Yes' if any(birthday[i] == birthday[i + 1] for i in range(N - 1)) else 'No')

#3156
K, N = map(int, input().split())
ans = []
for x in range(1, N + 1):
    if (x6 := x ** 6) > N: break
    for y in range(1, N + 1):
        if x6 + (y4 := y ** 4) > N: break
        if (n := x6 + y4) < K: continue
        z2 = n // K
        if K * z2 != n: continue
        z = max(0, int(z2 ** 0.5) - 2)
        while z ** 2 < z2: z += 1
        if z ** 2 != z2: continue
        ans.append(n)
ans.sort()
cnt = 0 if len(ans) == 0 else 1
for i in range(1, len(ans)):
    if ans[i - 1] != ans[i]: cnt += 1
print(cnt)

#3157
N = [int(Si) for Si in input().rstrip()]

while True:
    #最上位の3を検知し、繰り下がりで消す
    for i in range( len(N) ):
        if N[i] == 3:
            N[i] = 2
            for j in range(i + 1, len(N)):N[j] = 9
            break
    if sum(N) % 3 == 0:
        N[-1] -= 1
        for i in range( len(N) - 1, -1, -1 ):
            if N[i] < 0:
                N[i - 1] -= 1
                N[i] += 10
    else: break
print(''.join([str(Si) for Si in N]))

#3158
N, M, K = map(int, input().split())
A = list(map(lambda x: int(x) - 1, input().split()))
T = [tuple(map(int, input().split())) for _ in range(N)]

#TSPするの・・・? → M <= 5なのでpermutationsで大丈夫そう
import itertools
ans = ~ ( - 1 << 63)
for S in itertools.permutations( range(N), r = M ):
    dist = sum(T[ S[i] ][ S[i + 1] ] for i in range(M - 1))
    for Ai in A:
        ans = min( ans, dist + T[ S[-1] ][Ai] )
print(ans)

#3159
N = int(input())
P = [2, 3, 5, 7, 11, 13, 17, 19, 23]
base = 1
for p in P: base *= p
ans = [base] * 10
for i in range( len(P) ):
    ans[i] //= P[i]
print(*ans[:N])
'''

#3160
N, M = map(int, input().split())
MOD = 998244353

if N == 1:
    ans = 0
    for i in range(M): ans += i
    exit( print(ans * pow(M, -1, MOD) % MOD ) )

#combination 余計算
fact = [x := 1] + [x := x * i % MOD for i in range(1, N + M + 1)]
finv = [x := pow(x, -1, MOD)] + [x := x * i % MOD for i in range(N + M, 0, -1)]
finv.reverse()
comb = lambda n, k: fact[n] * finv[n - k] % MOD * finv[k] % MOD if 0 <= k <= n else 0

#最低点(スコア)Siを決めうつ。残りの得点の自由度は M - (Si * N)
ans = 0
bunbo = 0
for Si in range(M):
    base = M - Si * N
    if base < 0: continue

    #[0, base]点をN人に分配する場合の数: comb( base + N, N )
    #このうち、N人が全員1点以上余計に獲得する場合の数: comb( base - N + N, N )
    cnt = comb(base + N, N) - comb(base, N)

    #一応手動で: base == M のとき、最高点がM点の人が制約違反となってしまう
    #本来は包除原理で弾くべき?(最高点がn人として上記の包除)
    #今回の制約なら引くだけでOK  というか無視してもいい
    if Si == 0: cnt -= N
    ans += Si * cnt % MOD
    bunbo += cnt

#bunbo % MOD == 0 だと破綻する が回避方法も思いつかない ので投げる
print( ans % MOD * pow(bunbo % MOD, -1, MOD) % MOD )
0