結果
| 問題 |
No.942 プレゼント配り
|
| コンテスト | |
| ユーザー |
mkawa2
|
| 提出日時 | 2019-12-10 11:04:18 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 176 ms / 2,000 ms |
| コード長 | 1,633 bytes |
| コンパイル時間 | 101 ms |
| コンパイル使用メモリ | 12,928 KB |
| 実行使用メモリ | 20,272 KB |
| 最終ジャッジ日時 | 2024-06-23 23:25:46 |
| 合計ジャッジ時間 | 3,480 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 18 |
ソースコード
import sys
sys.setrecursionlimit(10 ** 6)
int1 = lambda x: int(x) - 1
p2D = lambda x: print(*x, sep="\n")
def MI(): return map(int, sys.stdin.readline().split())
def LI(): return list(map(int, sys.stdin.readline().split()))
def LLI(rows_number): return [LI() for _ in range(rows_number)]
# lからrの両端からhalf個ずつ持っていく分
def div2(l, r, half):
res = []
for d in range(half):
res += [l + d, r - d]
return res
# 最初1~3kのプレゼントのうち、k人中i番目の子に渡す分
def div3(i, k):
s = (1 + 3 * k) * 3 // 2
res = [i + 1, (i + k // 2) % k + k + 1]
res += [s - res[0] - res[1]]
return res
def main():
n, k = MI()
# 基本的に1こずつ配る(つまりn=k)のは無理
# ただし子ども1人のときだけはいける
if n == 1:
print("Yes")
print(*[x + 1 for x in range(k)])
exit()
if n == k:
print("No")
exit()
# 総和がkの倍数でないときも無理
if n * (n + 1) // 2 % k:
print("No")
exit()
one = n // k # 1人分の個数
print("Yes")
# 一人あたりが奇数の時は最初の3k個を均等になるように配って
# あとは偶数のときと同じ
if one % 2:
half = (one - 3) // 2
for i in range(k):
print(*div3(i, k), *div2(3 * k + 1 + half * i, n - half * i, half))
# 一人あたりが偶数の時はプレゼントの両端からペアにして持っていく
else:
half = one // 2
for i in range(k):
print(*div2(1 + half * i, n - half * i, half))
main()
mkawa2