Автор задачі: | Andrii Kholod (Connect) |
Підготував: | Andrii Kholod (Connect) |
Розбір: | Andrii Kholod (Connect) |
Розв'язання
Нехай перше число, яке вибрав Андрій, дорівнює . Тоді масив має вигляд
x, x+1, x+2, \ldots, x+n-1.
Спочатку розглянемо випадок m=2.
Якщо n=1, Андрій може вибрати непарне число, тому Тарас не зможе виграти.
Якщо n\ge 2, то серед будь-яких двох послідовних цілих чисел є парне, тому Тарас може вибрати підвідрізок, що складається лише з цього числа.
Отже, для m=2 Тарас виграє тоді й лише тоді, коли n\ge 2.
Тепер нехай непарне.
Якщо n\ge m, Тарас може вибрати будь-які послідовних елементів. Їх сума ділиться на , тому Тарас завжди виграє.
Тепер розглянемо випадок n<m.
Нехай P_k — сума перших елементів. Маємо
P_k = kx + \frac{k(k-1)}{2}.
Будь-який непорожній підвідрізок можна подати у вигляді P_j-P_i для деяких 0\le i<j\le n.
Його сума дорівнює
P_j-P_i = (j-i)\left(x+\frac{i+j-1}{2}\right).
Оскільки 1\le j-i\le n<m і є простим, число j-i не ділиться на .
Також, оскільки непарне, число має обернений елемент за модулем .
Тому сума підвідрізка ділиться на тоді й лише тоді, коли
2x+i+j-1 \equiv 0 \pmod m.
Еквівалентно,
i+j \equiv 1-2x \pmod m.
Зауважимо, що для всіх пар 0\le i<j\le n значення i+j може набувати кожного цілого значення від до 2n-1.
Отже, якщо
2n-1\ge m,
то серед цих значень є представники всіх можливих лишків за модулем . Тому незалежно від значення Тарас завжди зможе знайти відповідний непорожній підвідрізок.
З іншого боку, якщо
2n-1<m,
то значення 1,2,\ldots,2n-1 не покривають усі лишки за модулем .
Оскільки — непарне просте число, при зміні значення 1-2x може набувати будь-якого лишку за модулем . Тому Андрій може вибрати таке , що 1-2x не представлене серед 1,2,\ldots,2n-1.
У такому випадку Тарас не зможе знайти підвідрізок, сума якого ділиться на .
Отже, у всіх випадках Тарас виграє тоді й лише тоді, коли
2n-1\ge m.
Часова складність розв'язання — .
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll n, m;
cin >> n >> m;
if (2 * n - 1 >= m)
cout << "Taras\n";
else
cout << "Andrii\n";
return 0;
}