#include <stdint.h>
#include <stdlib.h>
static int randto(int n) {
int r;
int maxrand = (RAND_MAX / n) * n;
do r
= rand(); while (r
>= maxrand
); return r % n;
}
static void shuffle(unsigned *x, size_t n) {
while (--n) {
size_t j = randto(n + 1);
unsigned tmp = x[n];
x[n] = x[j];
x[j] = tmp;
}
}
uint16_t nrand16(int n) {
uint16_t v = 0;
static unsigned pos[16] = {0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15};
shuffle(pos, 16);
while (n--) v |= (1U << pos[n]);
return v;
}
uint32_t nrand32(int n) {
uint32_t v = 0;
static unsigned pos[32] = { 0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31};
shuffle(pos, 32);
while (n--) v |= (1U << pos[n]);
return v;
}
#define TEST
#ifdef TEST
#include <stdio.h>
#include <time.h>
int main(void) {
for (int k
= 0; k
< 17; k
++) printf("%04X %04X\n", nrand16
(k
), nrand16
(k
)); for (int k
= 0; k
< 33; k
++) printf("%08X %08X\n", nrand32
(k
), nrand32
(k
)); }
#endif
I2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgpzdGF0aWMgaW50IHJhbmR0byhpbnQgbikgewogIGludCByOwogIGludCBtYXhyYW5kID0gKFJBTkRfTUFYIC8gbikgKiBuOwogIGRvIHIgPSByYW5kKCk7IHdoaWxlIChyID49IG1heHJhbmQpOwogIHJldHVybiByICUgbjsKfQoKc3RhdGljIHZvaWQgc2h1ZmZsZSh1bnNpZ25lZCAqeCwgc2l6ZV90IG4pIHsKICB3aGlsZSAoLS1uKSB7CiAgICBzaXplX3QgaiA9IHJhbmR0byhuICsgMSk7CiAgICB1bnNpZ25lZCB0bXAgPSB4W25dOwogICAgeFtuXSA9IHhbal07CiAgICB4W2pdID0gdG1wOwogIH0KfQoKdWludDE2X3QgbnJhbmQxNihpbnQgbikgewogIHVpbnQxNl90IHYgPSAwOwogIHN0YXRpYyB1bnNpZ25lZCBwb3NbMTZdID0gezAsIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNX07CiAgc2h1ZmZsZShwb3MsIDE2KTsKICB3aGlsZSAobi0tKSB2IHw9ICgxVSA8PCBwb3Nbbl0pOwogIHJldHVybiB2Owp9Cgp1aW50MzJfdCBucmFuZDMyKGludCBuKSB7CiAgdWludDMyX3QgdiA9IDA7CiAgc3RhdGljIHVuc2lnbmVkIHBvc1szMl0gPSB7IDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxfTsKICBzaHVmZmxlKHBvcywgMzIpOwogIHdoaWxlIChuLS0pIHYgfD0gKDFVIDw8IHBvc1tuXSk7CiAgcmV0dXJuIHY7Cn0KCiNkZWZpbmUgVEVTVAojaWZkZWYgVEVTVAojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHRpbWUuaD4KCmludCBtYWluKHZvaWQpIHsKICBzcmFuZCh0aW1lKDApKTsKICBmb3IgKGludCBrID0gMDsgayA8IDE3OyBrKyspIHByaW50ZigiJTA0WCAlMDRYXG4iLCBucmFuZDE2KGspLCBucmFuZDE2KGspKTsKICBmb3IgKGludCBrID0gMDsgayA8IDMzOyBrKyspIHByaW50ZigiJTA4WCAlMDhYXG4iLCBucmFuZDMyKGspLCBucmFuZDMyKGspKTsKfQojZW5kaWY=