Будь-яке натуральне число єдиним чином можна подати у вигляді i = k \cdot x^2, де вільне від квадратів, тобто не ділиться на жоден квадрат простого числа. Число називається вільною від квадратів частиною числа . Позначимо її . Наприклад:
6 = 2 \cdot 3, тому sf[6] = 6;
12 = 2^2 \cdot 3, тому sf[12] = 3;
Теорема. Добуток a \cdot b є повним квадратом тоді і тільки тоді, коли sf[a] = sf[b].
Доведення. Нехай
де k_1 і k_2 вільні від квадратів. Тоді
Цей вираз є повним квадратом тоді і тільки тоді, коли повним квадратом є k_1k_2. Але числа k_1 і k_2 вільні від квадратів. Отже, k_1k_2 є повним квадратом лише якщо k_1 = k_2.
Зведення до підрахунку груп. З теореми випливає, що числа від до розбиваються на групи за значенням , і пара підходить (a \cdot b є точним квадратом) тоді і тільки тоді, коли і лежать в одній групі.
Нехай дорівнює кількості чисел i~(1 \le i \le n), для яких sf[i] = k. Для його обчислення достатньо для кожного виконати операцію cnt[sf[i]]++.
Якщо в групі чисел, то вона дає
пар. Відповідь дорівнює сумі по всіх групах:
Найменший простий дільник. Для швидкого обчислення введемо масив , що дорівнює найменшому простому дільнику числа . Наприклад:
Масив обчислюється модифікованим решетом Ератосфена: при обробці простого значення spf[j] = p присвоюється кожному кратному числа , для якого воно ще не було встановлено.
Маючи масив , можна обчислити квадрат-вільну частину кожного числа . Нехай — найменший простий дільник числа (spf[i] = p). Розглянемо два випадки:
зустрічається в розкладі числа щонайменше два рази. Це означає, що число ділиться на p^2. Два однакові прості множники утворюють повний квадрат, тому їх можна виключити з квадрат-вільної частини:
Наприклад:
sf[12] = sf[3], оскільки spf[12] = 2 і ділиться на 2^2;
= , оскільки spf[45] = 3 і ділиться на 3^2;
зустрічається в розкладі числа лише один раз. Тому множник повинен залишитися в квадрат-вільній частині:
Наприклад:
sf[30] = sf[15] \cdot 2, оскільки spf[30] = 2 і не ділиться на 2^2;
sf[18] = sf[9] \cdot 2, оскільки spf[18] = 2 і не ділиться на 2^2;
Приклад
Обчислимо відповідь для n = 10.
i | розклад на множники | квадрат-вільна частина |
1 * 2^2 | ||
2 * 3 | ||
2 * 2^2 | ||
1 * 3^2 | ||
2 * 5 |
Групуємо числа в масиві за .
cnt[1] = 3: (1, 4, 9) | cnt[6] = 1: (6) |
cnt[2] = 2: (2, 8) | cnt[7] = 1: (7) |
cnt[3] = 1: (3) | cnt[8] = 0: () |
cnt[4] = 0: () | cnt[9] = 0: () |
cnt[5] = 1: (5) | cnt[10] = 1: (10) |
Відповідь дорівнює
Реалізація алгоритму
Оголосимо константи та масиви.
#define MAXN 1000000
#define MOD 1000000007
int spf[MAXN + 1]; // мінімальний простий дільник числа
int sf[MAXN + 1]; // квадрат-вільні частини числа
int cnt[MAXN + 1]; // кількість чисел із заданим sfЧитаємо вхідне значення .
scanf("%d", &n);Застосовуючи метод решета Ератосфена, заповнюємо масив :
повинно містити мінімальний простий дільник числа
Спочатку вважаємо, що кожне число ділиться саме на себе. Але це тимчасово.
for (i = 1; i <= n; i++) spf[i] = i;У змінній перебираємо числа від до \sqrt{n}.
for (i = 2; i * i <= n; i++)
{
if (spf[i] == i)
{Якщо число просте, у змінній перебираємо числа i^2, i^2 + i, i^2 + 2i, ... . Усі ці числа мають простий дільник (оскільки spf[i] = i). Якщо spf[j] = j, то оновлюємо мінімальний простий дільник для числа .
for (j = i * i; j <= n; j += i)
if (spf[j] == j) spf[j] = i;
}
}Для кожного числа обчислюємо його вільну від квадратів частину. Результат заносимо в .
sf[1] = 1;
for (i = 2; i <= n; i++)
{Змінна містить найменший простий дільник числа .
p = spf[i];
x = i / p;Якщо ділиться на p^2, то sf[i] = sf[i / p^2].
if (x % p == 0)
sf[i] = sf[x / p];Якщо не ділиться на p^2 (але ділиться на ), то sf[i] = sf[i / p] \cdot p.
else
sf[i] = sf[x] * p;
}Групуємо числа за їхньою квадрат-вільною частиною.
for (i = 1; i <= n; i++)
cnt[sf[i]]++;Обчислюємо відповідь — шукану кількість пар.
res = 0;
for (i = 1; i <= n; i++)
if (cnt[i] >= 2)
res = (res + cnt[i] * (cnt[i] - 1) / 2) % MOD;Виводимо відповідь.
printf("%lld\n", res);