#include <iostream>
using namespace std;
int bitcount(int x) {
int c = 0;
while (x) {
c += x & 1;
x>>=1;
}
return c;
}
int bit(int v, int x, int y) {
return ((v>>(y*5+x))&1)!=0;
}
bool isBingo(int v) {
return (bit(v, 0, 0)&&bit(v, 0, 1)&&bit(v, 0, 2)&&bit(v, 0, 3)&&bit(v, 0, 4))
|| (bit(v, 1, 0)&&bit(v, 1, 1)&&bit(v, 1, 2)&&bit(v, 1, 3)&&bit(v, 1, 4))
|| (bit(v, 2, 0)&&bit(v, 2, 1)&&bit(v, 2, 2)&&bit(v, 2, 3)&&bit(v, 2, 4))
|| (bit(v, 3, 0)&&bit(v, 3, 1)&&bit(v, 3, 2)&&bit(v, 3, 3)&&bit(v, 3, 4))
|| (bit(v, 4, 0)&&bit(v, 4, 1)&&bit(v, 4, 2)&&bit(v, 4, 3)&&bit(v, 4, 4))
|| (bit(v, 0, 0)&&bit(v, 1, 0)&&bit(v, 2, 0)&&bit(v, 3, 0)&&bit(v, 4, 0))
|| (bit(v, 0, 1)&&bit(v, 1, 1)&&bit(v, 2, 1)&&bit(v, 3, 1)&&bit(v, 4, 1))
|| (bit(v, 0, 2)&&bit(v, 1, 2)&&bit(v, 2, 2)&&bit(v, 3, 2)&&bit(v, 4, 2))
|| (bit(v, 0, 3)&&bit(v, 1, 3)&&bit(v, 2, 3)&&bit(v, 3, 3)&&bit(v, 4, 3))
|| (bit(v, 0, 4)&&bit(v, 1, 4)&&bit(v, 2, 4)&&bit(v, 3, 4)&&bit(v, 4, 4))
|| (bit(v, 0, 0)&&bit(v, 1, 1)&&bit(v, 2, 2)&&bit(v, 3, 3)&&bit(v, 4, 4))
|| (bit(v, 0, 4)&&bit(v, 1, 3)&&bit(v, 2, 2)&&bit(v, 3, 1)&&bit(v, 4, 0))
;
}
bool isReach(int v) {
return (4==bit(v, 0, 0)+bit(v, 0, 1)+bit(v, 0, 2)+bit(v, 0, 3)+bit(v, 0, 4))
|| (4==bit(v, 1, 0)+bit(v, 1, 1)+bit(v, 1, 2)+bit(v, 1, 3)+bit(v, 1, 4))
|| (4==bit(v, 2, 0)+bit(v, 2, 1)+bit(v, 2, 2)+bit(v, 2, 3)+bit(v, 2, 4))
|| (4==bit(v, 3, 0)+bit(v, 3, 1)+bit(v, 3, 2)+bit(v, 3, 3)+bit(v, 3, 4))
|| (4==bit(v, 4, 0)+bit(v, 4, 1)+bit(v, 4, 2)+bit(v, 4, 3)+bit(v, 4, 4))
|| (4==bit(v, 0, 0)+bit(v, 1, 0)+bit(v, 2, 0)+bit(v, 3, 0)+bit(v, 4, 0))
|| (4==bit(v, 0, 1)+bit(v, 1, 1)+bit(v, 2, 1)+bit(v, 3, 1)+bit(v, 4, 1))
|| (4==bit(v, 0, 2)+bit(v, 1, 2)+bit(v, 2, 2)+bit(v, 3, 2)+bit(v, 4, 2))
|| (4==bit(v, 0, 3)+bit(v, 1, 3)+bit(v, 2, 3)+bit(v, 3, 3)+bit(v, 4, 3))
|| (4==bit(v, 0, 4)+bit(v, 1, 4)+bit(v, 2, 4)+bit(v, 3, 4)+bit(v, 4, 4))
|| (4==bit(v, 0, 0)+bit(v, 1, 1)+bit(v, 2, 2)+bit(v, 3, 3)+bit(v, 4, 4))
|| (4==bit(v, 0, 4)+bit(v, 1, 3)+bit(v, 2, 2)+bit(v, 3, 1)+bit(v, 4, 0))
;
}
int main() {
int total[26] = {0};
int bingo[26] = {0};
int reach[26] = {0};
const int end = 1 << 25;
for (int i = 0; i < end; i++) {
int c = bitcount(i);
total[c]++;
if (isBingo(i)) bingo[c]++;
else if (isReach(i)) reach[c]++;
}
puts(" total bingo reach bingoRate reachRate bothRate");
for (int i = 0; i < 26; i++) {
double br = double(bingo[i]) / double(total[i]);
double rr = double(reach[i]) / double(total[i]);
double tr = double(bingo[i]+reach[i]) / double(total[i]);
printf("N=%2d: %7d %7d %7d %0.8lf %0.8lf %0.8lf\n",
i, total[i], bingo[i], reach[i],
br,rr,tr);
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBiaXRjb3VudChpbnQgeCkgewoJaW50IGMgPSAwOwoJd2hpbGUgKHgpIHsKCQljICs9IHggJiAxOwoJCXg+Pj0xOwoJfQoJcmV0dXJuIGM7Cn0KCmludCBiaXQoaW50IHYsIGludCB4LCBpbnQgeSkgewoJcmV0dXJuICgodj4+KHkqNSt4KSkmMSkhPTA7Cn0KCmJvb2wgaXNCaW5nbyhpbnQgdikgewoJcmV0dXJuIChiaXQodiwgMCwgMCkmJmJpdCh2LCAwLCAxKSYmYml0KHYsIDAsIDIpJiZiaXQodiwgMCwgMykmJmJpdCh2LCAwLCA0KSkKCQl8fCAoYml0KHYsIDEsIDApJiZiaXQodiwgMSwgMSkmJmJpdCh2LCAxLCAyKSYmYml0KHYsIDEsIDMpJiZiaXQodiwgMSwgNCkpCgkJfHwgKGJpdCh2LCAyLCAwKSYmYml0KHYsIDIsIDEpJiZiaXQodiwgMiwgMikmJmJpdCh2LCAyLCAzKSYmYml0KHYsIDIsIDQpKQoJCXx8IChiaXQodiwgMywgMCkmJmJpdCh2LCAzLCAxKSYmYml0KHYsIDMsIDIpJiZiaXQodiwgMywgMykmJmJpdCh2LCAzLCA0KSkKCQl8fCAoYml0KHYsIDQsIDApJiZiaXQodiwgNCwgMSkmJmJpdCh2LCA0LCAyKSYmYml0KHYsIDQsIDMpJiZiaXQodiwgNCwgNCkpCgkJfHwgKGJpdCh2LCAwLCAwKSYmYml0KHYsIDEsIDApJiZiaXQodiwgMiwgMCkmJmJpdCh2LCAzLCAwKSYmYml0KHYsIDQsIDApKQoJCXx8IChiaXQodiwgMCwgMSkmJmJpdCh2LCAxLCAxKSYmYml0KHYsIDIsIDEpJiZiaXQodiwgMywgMSkmJmJpdCh2LCA0LCAxKSkKCQl8fCAoYml0KHYsIDAsIDIpJiZiaXQodiwgMSwgMikmJmJpdCh2LCAyLCAyKSYmYml0KHYsIDMsIDIpJiZiaXQodiwgNCwgMikpCgkJfHwgKGJpdCh2LCAwLCAzKSYmYml0KHYsIDEsIDMpJiZiaXQodiwgMiwgMykmJmJpdCh2LCAzLCAzKSYmYml0KHYsIDQsIDMpKQoJCXx8IChiaXQodiwgMCwgNCkmJmJpdCh2LCAxLCA0KSYmYml0KHYsIDIsIDQpJiZiaXQodiwgMywgNCkmJmJpdCh2LCA0LCA0KSkKCQl8fCAoYml0KHYsIDAsIDApJiZiaXQodiwgMSwgMSkmJmJpdCh2LCAyLCAyKSYmYml0KHYsIDMsIDMpJiZiaXQodiwgNCwgNCkpCgkJfHwgKGJpdCh2LCAwLCA0KSYmYml0KHYsIDEsIDMpJiZiaXQodiwgMiwgMikmJmJpdCh2LCAzLCAxKSYmYml0KHYsIDQsIDApKQoJCTsKfQoKYm9vbCBpc1JlYWNoKGludCB2KSB7CglyZXR1cm4gKDQ9PWJpdCh2LCAwLCAwKStiaXQodiwgMCwgMSkrYml0KHYsIDAsIDIpK2JpdCh2LCAwLCAzKStiaXQodiwgMCwgNCkpCgkJfHwgKDQ9PWJpdCh2LCAxLCAwKStiaXQodiwgMSwgMSkrYml0KHYsIDEsIDIpK2JpdCh2LCAxLCAzKStiaXQodiwgMSwgNCkpCgkJfHwgKDQ9PWJpdCh2LCAyLCAwKStiaXQodiwgMiwgMSkrYml0KHYsIDIsIDIpK2JpdCh2LCAyLCAzKStiaXQodiwgMiwgNCkpCgkJfHwgKDQ9PWJpdCh2LCAzLCAwKStiaXQodiwgMywgMSkrYml0KHYsIDMsIDIpK2JpdCh2LCAzLCAzKStiaXQodiwgMywgNCkpCgkJfHwgKDQ9PWJpdCh2LCA0LCAwKStiaXQodiwgNCwgMSkrYml0KHYsIDQsIDIpK2JpdCh2LCA0LCAzKStiaXQodiwgNCwgNCkpCgkJfHwgKDQ9PWJpdCh2LCAwLCAwKStiaXQodiwgMSwgMCkrYml0KHYsIDIsIDApK2JpdCh2LCAzLCAwKStiaXQodiwgNCwgMCkpCgkJfHwgKDQ9PWJpdCh2LCAwLCAxKStiaXQodiwgMSwgMSkrYml0KHYsIDIsIDEpK2JpdCh2LCAzLCAxKStiaXQodiwgNCwgMSkpCgkJfHwgKDQ9PWJpdCh2LCAwLCAyKStiaXQodiwgMSwgMikrYml0KHYsIDIsIDIpK2JpdCh2LCAzLCAyKStiaXQodiwgNCwgMikpCgkJfHwgKDQ9PWJpdCh2LCAwLCAzKStiaXQodiwgMSwgMykrYml0KHYsIDIsIDMpK2JpdCh2LCAzLCAzKStiaXQodiwgNCwgMykpCgkJfHwgKDQ9PWJpdCh2LCAwLCA0KStiaXQodiwgMSwgNCkrYml0KHYsIDIsIDQpK2JpdCh2LCAzLCA0KStiaXQodiwgNCwgNCkpCgkJfHwgKDQ9PWJpdCh2LCAwLCAwKStiaXQodiwgMSwgMSkrYml0KHYsIDIsIDIpK2JpdCh2LCAzLCAzKStiaXQodiwgNCwgNCkpCgkJfHwgKDQ9PWJpdCh2LCAwLCA0KStiaXQodiwgMSwgMykrYml0KHYsIDIsIDIpK2JpdCh2LCAzLCAxKStiaXQodiwgNCwgMCkpCgkJOwp9CgoKaW50IG1haW4oKSB7CgkKCWludCB0b3RhbFsyNl0gPSB7MH07CglpbnQgYmluZ29bMjZdID0gezB9OwoJaW50IHJlYWNoWzI2XSA9IHswfTsKCQoJY29uc3QgaW50IGVuZCA9IDEgPDwgMjU7Cglmb3IgKGludCBpID0gMDsgaSA8IGVuZDsgaSsrKSB7CgkJaW50IGMgPSBiaXRjb3VudChpKTsKCQl0b3RhbFtjXSsrOwoJCWlmIChpc0JpbmdvKGkpKSBiaW5nb1tjXSsrOwoJCWVsc2UgaWYgKGlzUmVhY2goaSkpIHJlYWNoW2NdKys7Cgl9CgkKCXB1dHMoIiAgICAgIHRvdGFsICAgYmluZ28gICByZWFjaCAgIGJpbmdvUmF0ZSAgcmVhY2hSYXRlICBib3RoUmF0ZSIpOwoJZm9yIChpbnQgaSA9IDA7IGkgPCAyNjsgaSsrKSB7CgkJZG91YmxlIGJyID0gZG91YmxlKGJpbmdvW2ldKSAvIGRvdWJsZSh0b3RhbFtpXSk7CgkJZG91YmxlIHJyID0gZG91YmxlKHJlYWNoW2ldKSAvIGRvdWJsZSh0b3RhbFtpXSk7CgkJZG91YmxlIHRyID0gZG91YmxlKGJpbmdvW2ldK3JlYWNoW2ldKSAvIGRvdWJsZSh0b3RhbFtpXSk7CgkJcHJpbnRmKCJOPSUyZDogJTdkICU3ZCAlN2QgJTAuOGxmICUwLjhsZiAlMC44bGZcbiIsCgkJCWksIHRvdGFsW2ldLCBiaW5nb1tpXSwgcmVhY2hbaV0sCgkJCWJyLHJyLHRyKTsKCX0KCQoJcmV0dXJuIDA7Cn0=