結果
問題 | No.3161 Find Presents |
ユーザー |
![]() |
提出日時 | 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 |
ソースコード
#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)