Ділиться чи ні#13059

Ділиться чи ні (Розбір)

Автор задачі:

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;
}