Editorial for Cặp may mắn


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Subtask 1

Duyệt trâu tất cả những cặp (ai,aj) trong mảng a, để kiểm tra một số có phải là chính phương, ta có thể dùng hàm sqrt() hoặc chặt nhị phân.

ĐPT: O(n2)

Subtask 2

ai103, nên thay vì duyệt chỉ số (i,j) thì ta duyệt theo giá trị.

Gọi cntu là số lần xuất hiện của giá trị u trong mảng, M là giá trị lớn nhất trong mảng, khi đó đáp án sẽ là i=1Mj=iMcnticntj nếu i+jkij là số chính phương.

ĐPT: O(M2) với M là giá trị lớn nhất trong mảng.

Sutbask 3

Ta xét tích của hai số xy bất kì, đặt z=xy.

Giả sử xy có dạng phân tích thừa số nguyên tố như sau:

x=p1a1p2a2pmam.

y=p1b1p2b2pmbm.

(ai,bi0, pi là số nguyên tố).

Khi đó: z=p1a1+b1p2a2+b2pmam+bm.

Để z là số chính phương, thì ai+bi0mod2(1im).

Từ đó suy ra được: aibimod2.

Như vậy, ta xét dạng "nén" của một số x như sau: g(x)=p1a1mod2p2a2mod2pmammod2.

Để xy là số chính phương thì: g(x)=g(y).

Như vậy ta chỉ cần xét những cặp x có cùng giá trị g(x), xong rồi chặt nhị phân để tìm những cặp thỏa mãn k.

Để phân tích x thành thừa số nguyên tố, ta có thể xử lý giống như cách kiểm tra số nguyên tố.

ĐPT: O((n+M)logM) với M là giá trị lớn nhất trong mảng.


Comments

Please read the guidelines before commenting.


There are no comments at the moment.