#include <iostream>
using namespace std;
class RandomGenerator{
protected:
unsigned int seed;
const long long int M;
const long long int a;
const long long int b;
public:
RandomGenerator(unsigned int, long long, long long, long long);
virtual long double generate() const = 0;
};
RandomGenerator::RandomGenerator(unsigned int seed, long long M, long long a, long long b) : seed(seed), M(M), a(a), b(b) {}
long double RandomGenerator::generate() const{
static long long prv = seed;
return (long double) (prv = (a * prv + b) % M) / (M-1);
}
class RandU : public RandomGenerator {
private:
static const long long M = 2147483648LL;
static const long long a = 65539;
static const long long b = 0;
public:
RandU(unsigned int);
virtual long double generate() const;
};
RandU::RandU(unsigned int nseed): RandomGenerator(nseed, M, a, b){}
long double RandU::generate() const{
return RandomGenerator::generate();
}
int main() {
cout << sizeof(RandomGenerator) << endl;
cout << sizeof(RandU) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY2xhc3MgUmFuZG9tR2VuZXJhdG9yewogICBwcm90ZWN0ZWQ6CiAgICAgICB1bnNpZ25lZCBpbnQgc2VlZDsKCiAgICAgICBjb25zdCBsb25nIGxvbmcgaW50IE07CiAgICAgICBjb25zdCBsb25nIGxvbmcgaW50IGE7CiAgICAgICBjb25zdCBsb25nIGxvbmcgaW50IGI7CgogICBwdWJsaWM6CiAgICAgICBSYW5kb21HZW5lcmF0b3IodW5zaWduZWQgaW50LCBsb25nIGxvbmcsIGxvbmcgbG9uZywgbG9uZyBsb25nKTsKCiAgICAgICB2aXJ0dWFsIGxvbmcgZG91YmxlIGdlbmVyYXRlKCkgIGNvbnN0ID0gMDsKfTsKClJhbmRvbUdlbmVyYXRvcjo6UmFuZG9tR2VuZXJhdG9yKHVuc2lnbmVkIGludCBzZWVkLCBsb25nIGxvbmcgTSwgbG9uZyBsb25nIGEsIGxvbmcgbG9uZyBiKSA6IHNlZWQoc2VlZCksIE0oTSksIGEoYSksIGIoYikge30KCmxvbmcgZG91YmxlIFJhbmRvbUdlbmVyYXRvcjo6Z2VuZXJhdGUoKSBjb25zdHsKICAgc3RhdGljIGxvbmcgbG9uZyBwcnYgPSBzZWVkOwoKICAgcmV0dXJuIChsb25nIGRvdWJsZSkgKHBydiA9IChhICogcHJ2ICsgYikgJSBNKSAvIChNLTEpOwp9IAoKY2xhc3MgUmFuZFUgOiBwdWJsaWMgUmFuZG9tR2VuZXJhdG9yIHsKCiAgIHByaXZhdGU6CiAgICAgICBzdGF0aWMgY29uc3QgbG9uZyBsb25nIE0gPSAyMTQ3NDgzNjQ4TEw7CiAgICAgICBzdGF0aWMgY29uc3QgbG9uZyBsb25nIGEgPSA2NTUzOTsKICAgICAgIHN0YXRpYyBjb25zdCBsb25nIGxvbmcgYiA9IDA7CgogICBwdWJsaWM6CiAgICAgICBSYW5kVSh1bnNpZ25lZCBpbnQpOwoKICAgICAgIHZpcnR1YWwgbG9uZyBkb3VibGUgZ2VuZXJhdGUoKSBjb25zdDsKfTsKClJhbmRVOjpSYW5kVSh1bnNpZ25lZCBpbnQgbnNlZWQpOiBSYW5kb21HZW5lcmF0b3IobnNlZWQsIE0sIGEsIGIpe30KCmxvbmcgZG91YmxlIFJhbmRVOjpnZW5lcmF0ZSgpIGNvbnN0ewogICAgcmV0dXJuIFJhbmRvbUdlbmVyYXRvcjo6Z2VuZXJhdGUoKTsKfQoKaW50IG1haW4oKSB7Cgljb3V0IDw8IHNpemVvZihSYW5kb21HZW5lcmF0b3IpIDw8IGVuZGw7CiAgICBjb3V0IDw8IHNpemVvZihSYW5kVSkgPDwgZW5kbDsKCXJldHVybiAwOwp9