| Быстрое умножение по модулю |
|---|
| Закончено |
Вам предложено дополнить следующий код:
#include <iostream>
using namespace std;
struct state
{
unsigned a, b, c, d;
};
uint32_t xorshift128(state& s)
{
uint32_t bk = s.d;
uint32_t ft = s.a;
s.d = s.c;
s.c = s.b;
s.b = s.a;
bk ^= bk « 11;
bk ^= bk » 8;
return s.a = bk ^ ft ^ (ft » 19);
}
uint64_t xorshift128ll(state& s)
{
uint64_t l = xorshift128(s);
uint64_t r = xorshift128(s);
return l « 32 | r;
}
struct test
{
uint64_t x, y, modulo;
};
const uint32_t BITS = 53;
test xorshift128_test(state& s)
{
test t;
t.x = xorshift128ll(s) & ((1ll « BITS) - 1);
t.y = xorshift128ll(s) & ((1ll « BITS) - 1);
t.modulo = xorshift128ll(s) & ((1ll « BITS) - 1) | (1ll « (BITS - 1));
if (t.x >= t.modulo)
t.x -= t.modulo;
if (t.y >= t.modulo)
t.y -= t.modulo;
return t;
}
uint64_t prod(const test& t)
{
// TODO
}
int main()
{
int n;
state s;
cin » n » s.a » s.b » s.c » s.d;
uint64_t ans = 0;
for (int i = 0; i < n; ++i)
ans += prod(xorshift128_test(s));
cout « ans « endl;
}
Напишите на месте «// TODO» функцию, находящую произведение 53-битных чисел t.x и t.y по 53-битному модулю t.modulo.
В первой строке находится целое число $$$n$$$ — количество тестов на умножение по модулю ($$$1 \leqslant n \leqslant 3\cdot 10^7$$$).
Во второй строке находится четыре целых числа $$$a$$$, $$$b$$$, $$$c$$$, $$$d$$$, разделённых пробелом — параметры генератора псевдослучайных чисел 'xorshift' ($$$0 \leqslant a,b,c,d \leqslant 2^{32}-1$$$).
Выведите одно число — сумму всех произведений t.x и t.y по модулю t.modulo, взятую по модулю $$$2^{64}$$$.
1 1 2 3 4
53876542305029254
| Название |
|---|


