Матч 388, Гладкие числа (SmoothNumbers)

Дивизион 1, Уровень 1

 

Натуральное число называется k-гладким, если его наибольший простой делитель не больше k. Вычислить, сколько имеется k-гладких натуральных чисел, не больших n.

 

Класс: SmoothNumbers

Метод: int countSmoothNumbers(int n, int k)

Ограничения: 1 £ n £ 100000, 1 £ k £ 100.

 

Вход. Целые числа n и k.

 

Выход. Количество k-гладких натуральных чисел, не больших n.

 

Пример входа

n

k

10

3

15

3

5

20

100000

100

 

Пример выхода

7

8

5

17442

 

 

РЕШЕНИЕ

перебор + разложение на множители

 

Задачу решим переборным способом. Для каждого натурального числа i от 1 до n выясним, лежат ли его простые множители в промежутке от 2 до k. Для этого переберем все делители числа i от 2 до k и разделим i на них. Если в результате получится 1, то число i является k-гладким. В переменной res подсчитываем количество k-гладких чисел.

 

ПРОГРАММА

 

#include <stdio.h>

 

class SmoothNumbers

{

public:

  int countSmoothNumbers(int n, int k)

  {

    int temp, i, j, res = 0;

    for(i = 1; i <= n; i++)

    {

      temp = i;

      for(j = 2; j <= k; j++)

        while(temp % j == 0) temp /= j;

      res += (temp == 1);

    }

    return res;

  }

};