Найти количество всех таких разных кортежей, (i, j, k) где (i* j)%k == 0

#algorithm #combinations #counting #number-theory

#алгоритм #комбинации #подсчет #теория чисел

Вопрос:

Дано число n . Как найти количество всех таких разных кортежей?

(i, j, k) где (i*j)%k == 0, где 1<=i<=n, 1<=j<=n, 1<=k<=n в O(n^2) или лучше.

Комментарии:

1. Где ваши мысли и усилия?

Ответ №1:

  1. Сохранить количество i * j пар в хэш-таблице / карте / массиве
  2. Сделайте что-то вроде просеивания, чтобы подсчитать все кратные k в частотном массиве

Пример кода:

 vector<int>freq(n*n 1); //that's just array of n*n 1 zeroes

for(int i=1; i<=n; i  )
for(int j=1; j<=n; j  )
    freq[i*j]  ;

int cnt = 0;
for(int k=1; k<=n; k  )
    for(int j=0; j<=n*n; j =k) //note these loops look like n^3 at first glance yet it's something like n^2 log n (check harmonic number if you're curious why)
    cnt =freq[j];
  

Комментарии:

1. Спасибо за ответ, но я думаю, что сложность равна (n ^ 2 log * n), потому что n^2 * (1/1 1/2 1/3 … 1/ n) приближается к n ^ 2 * (logn)

2. Вы должны быть в состоянии сделать for(int j = k; j <= n * n; j = k) , поскольку нулевая позиция всегда равна нулю.