Позначимо числом добуток множників a_1, a_2 \dots, a_N із вхідних даних:
За умовою задачі, нам необхідно знайти в розкладі числа на прості множники
таке просте число p_l, 1 \le l \le L, для якого s_l \ge 2.
Воно існуватиме, якщо виконується принаймні одна з умов:
Існують множники a_i, a_j, 1 \le i, j \le N, i \ne j такі, що a_i \bmod p_l = 0, a_j \bmod p_l = 0
Існує множник a_i, 1 \le i \le N такий, що a_i \bmod {p_l}^2 = 0
Розібʼємо початкову на задачу на дві відповідні підзадачі.
Знайдемо попарно НСД(a_i, a_j), 1 \le i, j \le N, i \ne j всіх множників числа . Якщо будь-яка пара множників має спільник дільник більше за одиницю, це і буде відповіддю на задачу.
Складність підзадачі за часом — O(N^2).
Якщо число a_i ділиться націло на {p_l}^2, то його можна представити в наступному вигляді:
За допомогою решета Ератосфена знайдемо всі прості дільники d_1, d_2, \ldots, d_D числа a_i, які не перевищують \sqrt[3]{10^{18}} = 10^6.
Якщо існує такий дільник d_k, 1 \le k \le D, для якого a_i \bmod {d_k}^2 = 0, то d_k — це відповідь на задачу.
Якщо таких дільників серед d_1, d_2, \ldots, d_D немає, тоді поділимо число a_i на кожен з них і позначимо результат {a_i}^{'}. Тоді
Оскільки ми знайшли всі дільники до 10^6, то {p_l}, x^{'} \gt 10^6. При цьому, за умовою задачі, a_i \le 10^{18}, що протирічить попередній умові, оскільки добуток трьох чисел більших за 10^6 перевищує 10^{18}. Отже, x^{'} = 1.
Залишається перевірити, чи a_i є повним квадратом числа p_l. Якщо так, то p_l — це відповідь на задачу.
Складність підзадачі за часом — O(\sqrt[3]{|a_i|} \cdot \log{\log{\sqrt[3]{|a_i|}}} + N \cdot \pi(\sqrt[3]{|a_i|})),
де |a_i| — максимальне значення числа a_i, \pi(\sqrt[3]{|a_i|}) — кількість простих чисел, які не перевищують \sqrt[3]{|a_i|}.
Якщо ми не знайшли відповідь в жодній з підзадач, тоді число — гарне.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
const int maxp = 1e6;
int prime[maxp];
vector<int> prs;
for (int i = 2; i < maxp; ++i)
prime[i] = 1;
for (int i = 2; i < maxp; ++i)
{
if (prime[i])
{
prs.push_back(i);
for (int j = i * 2; j < maxp; j += i)
prime[j] = 0;
}
}
int n;
cin >> n;
unsigned long long a[100];
for (int i = 0; i < n; ++i)
cin >> a[i];
for (int i = 0; i < n; ++i)
for (int j = i + 1; j < n; ++j)
if (gcd(a[i], a[j]) > 1)
{
cout << gcd(a[i], a[j]) << endl;
return 0;
}
for (int i = 0; i < n; ++i)
{
for (int j : prs)
if (a[i] % j == 0)
{
a[i] /= j;
if (a[i] % j == 0)
{
cout << j << endl;
return 0;
}
}
unsigned long long sq = sqrt(a[i]);
if (sq > 1 && sq * sq == a[i])
{
cout << sq << endl;
return 0;
}
}
cout << "Beautiful" << endl;
}