Gcd nə#12282

Gcd nə (Həll təhlili)

Problem Müəllifi:

Titan493ASST

Hazırlayan:

Hasan Saleh (MathModel)

Redaktə edən:

Hasan Saleh (MathModel)

Həll

Müşahidə 1. g=\gcd(a_1,\dots,a_n) olsun. hər a_i-ni bölür, bir əməliyyatdan sonra a_j \leftarrow a_j+g, bütün ədədlər hələ də -yə bölünür. Buna görə yeni gcd g' aşağıdakı şərti ödəyir: g' \ge g (gcd heç vaxt azalmaz).

Müşahidə 2. k\le 3, buna görə də hər əməliyyat üçün indekslərin bütün seçimlərini sınaqdan keçirə bilərik. Sıraların sayı n^k \le 100^3 = 10^6.

DFS/geri qaytarma ilə edin:

dərinlik (artıq əməliyyatını yerinə yetirmişik) vəziyyətində, cari ilə cavabı yeniləyin.

Əgər d=k-dirsə, dayanın. Cari gcd -ni hesablayın.

Hər indeks -ni sınayın: -ni a_i-yə əlavə edin, d+1-ə geri çağırın, sonra geri qaytarın.

Çətinlik \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()