Пари з повним квадратом#12428

Пари з повним квадратом (Розбір)

Будь-яке натуральне число єдиним чином можна подати у вигляді i = k \cdot x^2, де вільне від квадратів, тобто не ділиться на жоден квадрат простого числа. Число називається вільною від квадратів частиною числа . Позначимо її . Наприклад:

Теорема. Добуток a \cdot b є повним квадратом тоді і тільки тоді, коли sf[a] = sf[b].

Доведення. Нехай

a = k_1 \cdot x_2, \\ b = k_2 \cdot y_2,

де k_1 і k_2 вільні від квадратів. Тоді

a * b = k_1k_2 \cdot (xy)^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]]++.

Якщо в групі чисел, то вона дає

C_m^2 = \frac{m \cdot (m - 1)}{2}

пар. Відповідь дорівнює сумі по всіх групах:

\sum_k \frac{cnt[k] \cdot(cnt[k] - 1)}{2}

Найменший простий дільник. Для швидкого обчислення введемо масив , що дорівнює найменшому простому дільнику числа . Наприклад:

Масив обчислюється модифікованим решетом Ератосфена: при обробці простого значення spf[j] = p присвоюється кожному кратному числа , для якого воно ще не було встановлено.

Маючи масив , можна обчислити квадрат-вільну частину кожного числа . Нехай — найменший простий дільник числа (spf[i] = p). Розглянемо два випадки:

sf[i] = sf[i / p^2]

Наприклад:

  1. sf[12] = sf[3], оскільки spf[12] = 2 і ділиться на 2^2;

  2. = , оскільки spf[45] = 3 і ділиться на 3^2;

sf[i] = sf[i / p] \cdot p

Наприклад:

  1. sf[30] = sf[15] \cdot 2, оскільки spf[30] = 2 і не ділиться на 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)

Відповідь дорівнює

\frac{cnt[1] \cdot (cnt[1] - 1)}{2} + \frac{cnt[2] \cdot (cnt[2] - 1)}{2} = \frac{3 \cdot 2}{2} + \frac{2 \cdot 1}{2} = 3 + 1 = 4

Реалізація алгоритму

Оголосимо константи та масиви.

#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);