TCHS 08, Раунд 3, Один, Два, Три (OneTwoThree)

 

Найти наименьшее число, которое делится на все числа от 1 до n. Результат вернуть по модулю 987654321.

 

Класс: OneTwoThree

Метод: int minimalNumber(int n)

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

 

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

 

Выход. Наименьшее число, которое делится на все числа от 1 до n , взятое по модулю 987654321.

 

Пример входа

n

3

10

97969

 

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

6

2520

528039414

 

 

РЕШЕНИЕ

простые числа

 

В функции gen_primes при помощи решета Эратосфена присвоим prime[i] = 1, если i простое число и prime[i]  = 0 иначе. Обозначим через res результат. Тогда для каждого простого i (2 £ i £ n) значение res необходимо умножать на i, i2, i3, …, ik до тех пор, пока ik £ n. Каждое умножение следует производить по модулю 987654321.

 

ПРОГРАММА

 

#include <stdio.h>

#define MAX 100001

#define i64 long long

 

int prime[MAX];

 

void gen_primes()

{

  int i,j;

  for(i=0;i<MAX;i++) prime[i] = 1;

  for(i=2;i*i<=MAX;i++)

    if (prime[i])

      for(j=i;j*i<MAX;j++) prime[i*j] = 0;

}

 

class OneTwoThree

{

public:

  int minimalNumber(int n)

  {

    i64 temp;

    int i,res=1;

    gen_primes();

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

      if (prime[i])

      {

        temp = prime[i];

        while(temp*i<=n) temp *= i;

        res = (res * temp) % 987654321;

      }

    return res;

  }

};