Автор проблеми: | Titan493ASST |
Підготовлено: | Hasan Saleh (MathModel) |
Редагував: | Hasan Saleh (MathModel) |
Розв'язок
Спостереження 1. Нехай g=\gcd(a_1,\dots,a_n). Оскільки ділить кожне a_i, після однієї операції a_j \leftarrow a_j+g, всі числа все ще діляться на . Отже, новий gcd g' задовольняє g' \ge g (gcd ніколи не зменшується).
Спостереження 2. k\le 3, тому ми можемо перебрати всі вибори індексів для кожної операції. Кількість послідовностей n^k \le 100^3 = 10^6.
Зробіть DFS/зворотний зв'язок:
на глибині стану (вже виконано операцій), оновіть відповідь з поточним .
Якщо d=k, зупиніться. Обчисліть поточний gcd .
Спробуйте кожен індекс : додайте до a_i, рекурсивно переходьте до d+1, потім скасуйте.
Складність \mathcal{O}(n^k)
from math import gcd
n=0
k=0
a=[]
best=0
def gcdarray():
g=a[0]
for x in a[1:]:
g=gcd(g, x)
return g
def rec(d):
global best
best=max(best, max(a))
if d==k:
return
g=gcdarray()
for i in range(n):
a[i]+=g
rec(d+1)
a[i]-=g
def solve():
global n,k,a,best
n,k=map(int, input().split())
a=list(map(int, input().split()))
best=max(a)
rec(0)
print(best)
for _ in range(int(input())):
solve()