結果

問題 No.3161 Find Presents
ユーザー navel_tos
提出日時 2025-05-23 22:12:06
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 423 ms / 4,000 ms
コード長 3,999 bytes
コンパイル時間 487 ms
コンパイル使用メモリ 82,896 KB
実行使用メモリ 95,256 KB
平均クエリ数 3400.61
最終ジャッジ日時 2025-05-23 22:12:33
合計ジャッジ時間 24,886 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 80
権限があれば一括ダウンロードができます

ソースコード

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 )
'''

#3161
#再帰・分割統治かな?
#stack: (xL, xR, yL, yR) : 区間内に必ずプレゼントがあると保証される区間
#区間が大きい方を再帰で探索
ans = []
stack = [(0, 10 ** 6 + 1, 0, 10 ** 6 + 1)]
while stack:
    xL, xR, yL, yR = stack.pop()
    if xL + 1 == xR and yL + 1 == yR:
        ans.append((xL, yL))
        continue
    if xR - xL > yR - yL:  #xのほうが長い: xを分割統治する
        mid = (xL + xR) >> 1
        nxt_Q = [(xL, mid, yL, yR), (mid, xR, yL, yR)]
    else:
        mid = (yL + yR) >> 1
        nxt_Q = [(xL, xR, yL, mid), (xL, xR, mid, yR)]
    for xL, xR, yL, yR in nxt_Q:
        print('?', xL, xR - 1, yL, yR - 1)
        if int(input()) == 1: stack.append((xL, xR, yL, yR))
        else: pass
print('!', len(ans))
for Xi, Yi in ans: print(Xi, Yi)
0