`Всеукраїнський центр проведення олімпіад в мережі Інтернет

Задача Segtree2k17.  В середовищі крутих олімпіадних гуру модно знати напам’ять розв'яок такої задачі:  Дано масив з N чисел та M запитів виду L R. На кожен такий запит потрібно вивести добуток елементів масиву, що мають індекси від L до R, включно. Оскільки, добуток може бути дуже великим, вам потрібно виводити відповідь по модулю.

Розглянемо таку  модифікацію цієї задачі: Умова задачі не змінюється, але змінено  обмеження:

Оскільки, в такому випадку вхідний файл буде дуже великим, його пропонується генерувати. Код генератора (С++) повинен бути вбудований в розв’язок. (Аналогічний код мовами Pascal та  Python  2* , 3*  можна завантажити тут).

const int MAXN = 1000 * 1000;
long long a[MAXN];
long long mod;

unsigned s;
unsigned getNext(){
    s ^= (s <<
13);
    s ^= (s >>
17);
    s ^= (s <<
5);
   
return s;
}


int main() {
   
unsigned n, m, seed ;
    cin
>> n >> m >> mod >> seed;
    s = seed;
   
for(int i = 0; i < n; i++){
        a[i] = getNext();
    }

   
long long ans = 0;
   
for(int i = 0; i < m; i++){
       
unsigned left = getNext() % n;
       
unsigned right = getNext() % n;
       
if(left > right) swap(left, right);

       
long long result = query(left, right);

        ans = (ans + result) % mod;
    }
}

Таким чином , вхідними даними будуть N, M, Mod, Seed, де Seed – початкове значення для генератора. У відповідь потрібно вивести суму відповідей на кожен запит (по модулю)

Технічні умови. Програма Segtree2k17  (яка містить вбудований код генератора!)  читає з пристрою стандартного введення натуральні числа N, M, Mod, Seed  (  seed<=232) Програма виводить до пристрою стандартного виведення єдине число – суму результатів (по модулю) на всіх запитах.

Приклади

Введення                                                  Виведен

10 15 1000000007 1                                216091399

Введення                                                 Виведення

5000 100000 1283189389247 8932   541836623127

Введення                                                   Виведення

1000 100 100007 7632                           47019

 

© LIKT 1998-2024