aacord’s memo

abcを中心にpythonで解いた問題のメモ、整理をしています。緑になった。

abc 165 e Rotation Matching (python)

サンプル2が結構ヒントになった。
まず m が最大値の時に条件を満たせばいいとわかる。
そして、初めの割り当ての2数 ( a, b ) の差(a < b)が、
一周すると (1,b+n-a+1) となるから、
n = 奇数のときは一周すると偶奇が変わる、n = 偶数のときは偶奇が変わらないと分かる。
なので、n = 奇数のときは (a-b) が異なる m 個の奇数になっていればよく、
これは (a, b) = ( (n-1)//2-i, (n+1)//2+i ) (0<= i <= m) とすれば実現可能
これはサンプル2がなぜ条件を満たすか遷移を書いて行ったりすると取り合えず奇数の時がわかると思う
n = 偶数のときは偶奇が変わらないので (a-b) を1から連続する異なる m 個の整数にすれば条件を満たす。
これは
(a, b) = ( n//2-i, 1+i ) (0<= i <= min(m, (n//2)//2))
= ( n-i, n//2+2+i ) ( 0 <= i <= max( 0 , (m-(n//2)//2) )
とすれば実現可能
作り方は色々あると思う。

n,m = map(int,input().split())
if n%2 == 1:
  for i in range(m):
    print((n-1)//2-i,(n+1)//2+i)
else:
  for i in range(min(m,(n//2)//2)):
    print(n//2-i,1+i)
  if m > (n//2)//2:
    for i in range(m-(n//2)//2):
      print(n-i,n//2+2+i)