Hướng giải của Mật mã điều hòa
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.
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Yêu cầu bài toán: In ra số cặp ~(i,j),i<j~ sao cho ~lcm(a_i,a_j )*gcd(a_i,a_j)~ có đúng 3 ước số.
Nhận xét 1: ~lcm(a_i,a_j )gcd(a_i,a_j )=a_ia_j~.
Nhận xét 2: Số có đúng 3 ước số là số chính phương và căn bậc hai của số đó là một số nguyên tố.
Nhận xét 3: Số cặp (i,j) thỏa mãn yêu cầu bài toán là số lượng các số nguyên tố bằng nhau cộng với số lượng số 1 nhân với số lượng a[i] chính phương mà √(a[i]) là số nguyên tố.
Như vậy để tạo ra ~a_i*a_j~ là số có 3 ước số thì có 2 trường hợp
TH1: ~a_i=a_j~ và ~a_i,a_j~ là các số nguyên tố.
TH2: a_i=1, và a_j là số chính phương, √(a_j ) là số nguyên tố.
Từ đó ta có giải thuật như sau:
Bước 1: Sàng nguyên tố để đánh dấu mảng nguyên tố.
Bước 2: Xây dựng mảng đếm số lượng số nguyên tố d[] trong mảng a.
Bước 3: Tính tổng số lượng các số nguyên tố bằng nhau.
Bước 4: Đếm x số lượng số 1 và y là số lượng số có đúng 3 ước số; lấy x*y là số cặp tạo nên tích a_i*a_j là số có đúng 3 ước số.
Kết quả là tổng của cả hai số lượng trên.
Mã:
for(int i=1;i<=n;i++)
{
if(nt[a[i]])// trường hợp 1 có các số ai, aj bằng nhau và là nguyên tố
{
s = s + d[a[i]];
d[a[i]]++;
}
if(a[i]==1) x++;//trường hợp 2 có ai = 1, aj là số có đúng 3 ước.
long long k = sqrt(a[i]);
if(k*k==a[i] && nt[k]) y++;
}
s = s + x*y;
Không có ý kiến tại thời điểm này.