Каосар та Гра#12261

Каосар та Гра (Розбір)

Автор проблеми:

AlKaosar Hussain

Підготовлено:

Hasan Saleh (MathModel)

Редаговано:

Hasan Saleh (MathModel)

Рішення

Розглядайте фальшивий стрибок як особистий пропуск: він споживає з вашого бюджету (у вас , у Каосара ) і залишає робота на тій же сходинці, просто передаючи хід супернику. Перший пропуск проходить, і згадайте базовий факт для гри "взяти ": гравець, який робить хід, програє точно на сходинках, які є кратними (k+1), а в іншому випадку виграє, переміщуючись до найближчого нижнього кратного (k+1).

Тепер знову введіть пропуски. Пропускати має сенс лише тоді, коли ви стикаєтеся з програшною базовою позицією (кратне (k+1)): якщо ви на виграшній базовій позиції, ви повинні негайно перейти до програшної для вашого суперника; віддаючи хід, ви нічого не виграєте. Отже, щоразу, коли виникає програшна базова позиція, обидва гравці хочуть пропустити; ці пропуски споживають два бюджети симетрично, поки одна сторона не закінчиться першою. Якщо p=q, щоразу, коли з'являється програшна базова позиція, два пропуски нейтралізують один одного парами, і ми повертаємося до базової гри: гравець, який робить хід з цієї позиції, є таким же, як без пропусків, тому загальний результат є точною базовою правилом, а саме ви програєте, якщо n \bmod (k+1)=0.

Якщо p\neq q, сторона з більшим бюджетом завжди може забезпечити, щоб інший гравець був першим, хто повинен фактично зробити хід з програшної базової позиції: щоразу, коли така позиція з'являється, обидва намагаються пропустити; після \min(p,q) таких протистоянь менший бюджет вичерпується на один крок раніше, і на наступній програшній базовій позиції цей гравець змушений зробити хід. Як тільки суперник є тим, хто повинен зробити хід з програшної базової позиції, ви відновлюєте базову виграшну стратегію (завжди переходьте до найближчого нижнього кратного (k+1) на своїх ходах), і подальші пропуски не потрібні. Отже, якщо p>q, ви виграєте для всіх ; якщо p<q, ви програєте для всіх ; а якщо p=q, гра зводиться до базового випадку з звичайною умовою на n \bmod (k+1).

Складність


for _ in range(int(input())):
   n,k,p,q = map(int,input().split())
   if p>q:
      print("yes")
   elif p == q:
      if n%(k+1)==0:
         print("no")
      else:
         print("yes")
   else:
      print("no")