Problem Müəllifi: | Tamzid Alahi (Tamzid1) və Hasan Saleh (MathModel) |
Hazırlayan: | Hasan Saleh (MathModel) |
Redaktə edən: | Hasan Saleh (MathModel) |
Həll
Hər bir indeks üçün sinif açarını müəyyən edin
Biz K_i=K_j olan cütlərinin sayını maksimuma çatdırmaq istəyirik, eyni zamanda bir dəfə əməliyyat a_x\leftarrow a_x+1 tətbiq etməyə icazə verilir.
1) Əsas xətt (əməliyyatsız). dəyəri olan \{K_i\} arasında tezliyi olsun. Etibarlı cütlərin sayı
2) -də bir artırma cəhd edin. Əgər a_i-ni artırsaq, onun açarı
bütün digər K_j eyni qalır. İndeks -nin cütlərə töhfəsi \text{cnt}[K_i]-1-dən
şəklində dəyişir, çünki biz konseptual olaraq əvvəlcə -ni \text{cnt}[K_i]-dən çıxarırıq, sonra isə onu K_i' sinfinə əlavə edirik. Beləliklə, yeni cəmi
Sadəcə olaraq
alırıq.
Məhdudiyyətlər a_i\le 10^5 verir, buna görə də a_i+1\le 10^5+1. -i 1\le x\le 100001 üçün bir dəfə xətti/başqa bir üsul ilə əvvəlcədən hesablayın.
Komplekslik \mathcal{O}(10^5 \log \log 10^5+\sum n)
import math
M=100001
phi=list(range(M+1))
for p in range(2,M+1):
if phi[p]==p:
for x in range(p,M+1,p):
phi[x]-=phi[x]//p
def lcm(a,b):
return a//math.gcd(a,b)*b
for _ in range(int(input())):
n=int(input())
a=list(map(int,input().split()))
K=[lcm(i+1, phi[a[i]]) for i in range(n)]
from collections import Counter
cnt=Counter(K)
base=sum(c*(c-1)//2 for c in cnt.values())
ans=base
for i in range(n):
x=K[i]
y=lcm(i+1, phi[a[i]+1])
cx=cnt[x]
cy=cnt.get(y,0)
if y==x:
cur=base
else:
cur=base-(cx-1)+cy
if cur>ans: ans=cur
print(ans)