Autor del Problema: | Tamzid Alahi (Tamzid1) y Hasan Saleh (MathModel) |
Preparado por: | Hasan Saleh (MathModel) |
Editado por: | Hasan Saleh (MathModel) |
Solución
Para cada índice , define la clave de clase
Queremos maximizar el número de pares con K_i=K_j, mientras podemos aplicar como máximo una operación a_x\leftarrow a_x+1 para un solo .
1) Línea base (sin operación). Deja que sea la frecuencia del valor entre \{K_i\}. El número de pares válidos es
2) Intenta un incremento en . Si aumentamos a_i, su clave se convierte en
mientras que todos los demás K_j permanecen iguales. La contribución de pares del índice cambia de \text{cnt}[K_i]-1 a
porque conceptualizamos eliminar de \text{cnt}[K_i] primero, luego lo agregamos a la clase de K_i'. Por lo tanto, el nuevo total es
Simplemente tomamos
Las restricciones dan a_i\le 10^5, así que a_i+1\le 10^5+1. Precomputamos para todos 1\le x\le 100001 una vez usando un estilo de criba de totientes lineal/primal.
Complejidad \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)