#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
#define NMAX 4000
typedef unsigned char uchar;
typedef unsigned int uint;
uchar matrix[NMAX][NMAX];
void
minit(int n)
{
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
if(n < 100)
matrix[i][j] = rand()%2;
else if(n < 1000 && rand()%3 == 0)
matrix[i][j] = 1;
else if(rand()%4 == 0)
matrix[i][j] = 1;
else
matrix[i][j] = 0;
}
void
mprint(int n)
{
char bit;
std::cout << n << '\n';
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
bit = matrix[i][j] + '0';
std::cout << bit;
}
std::cout << '\n';
}
}
uint
msquareones(int n)
{
uint item, ones;
ones = 0U;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++) {
item = 0U;
for(int k = 0; k < n; k++)
item ^= matrix[i][k] & matrix[k][j];
ones += item;
}
return ones;
}
int
main(int argc, char *argv[])
{
int n;
srand(time(NULL));
for(int i = 1; i < argc; i++) {
n = std::stoi(std::string(argv[i]));
if(n < 0)
n = 2;
if(n > NMAX)
n = NMAX;
minit(n);
mprint(n);
std::cout << msquareones(n) << '\n';
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Y3RpbWU+CiNpbmNsdWRlIDxjc3RkbGliPgoKI2RlZmluZSBOTUFYIDQwMDAKCnR5cGVkZWYgdW5zaWduZWQgY2hhciB1Y2hhcjsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgIHVpbnQ7Cgp1Y2hhciBtYXRyaXhbTk1BWF1bTk1BWF07Cgp2b2lkCm1pbml0KGludCBuKQp7Cglmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQoJCWZvcihpbnQgaiA9IDA7IGogPCBuOyBqKyspCgkJCWlmKG4gPCAxMDApCgkJCQltYXRyaXhbaV1bal0gPSByYW5kKCklMjsKCQkJZWxzZSBpZihuIDwgMTAwMCAmJiByYW5kKCklMyA9PSAwKQoJCQkJbWF0cml4W2ldW2pdID0gMTsKCQkJZWxzZSBpZihyYW5kKCklNCA9PSAwKQoJCQkJbWF0cml4W2ldW2pdID0gMTsKCQkJZWxzZQoJCQkJbWF0cml4W2ldW2pdID0gMDsKfQoKdm9pZAptcHJpbnQoaW50IG4pCnsKCWNoYXIgYml0OwoJc3RkOjpjb3V0IDw8IG4gPDwgJ1xuJzsKCWZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKCQlmb3IoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7CgkJCWJpdCA9IG1hdHJpeFtpXVtqXSArICcwJzsKCQkJc3RkOjpjb3V0IDw8IGJpdDsKCQl9CgkJc3RkOjpjb3V0IDw8ICdcbic7Cgl9Cn0KCnVpbnQKbXNxdWFyZW9uZXMoaW50IG4pCnsKCXVpbnQgaXRlbSwgb25lczsKCW9uZXMgPSAwVTsKCWZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspCgkJZm9yKGludCBqID0gMDsgaiA8IG47IGorKykgewoJCQlpdGVtID0gMFU7CgkJCWZvcihpbnQgayA9IDA7IGsgPCBuOyBrKyspCgkJCQlpdGVtIF49IG1hdHJpeFtpXVtrXSAmIG1hdHJpeFtrXVtqXTsKCQkJb25lcyArPSBpdGVtOwoJCX0KCXJldHVybiBvbmVzOwp9CgppbnQKbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CglpbnQgbjsKCglzcmFuZCh0aW1lKE5VTEwpKTsKCWZvcihpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKCQluID0gc3RkOjpzdG9pKHN0ZDo6c3RyaW5nKGFyZ3ZbaV0pKTsKCQlpZihuIDwgMCkKCQkJbiA9IDI7CgkJaWYobiA+IE5NQVgpCgkJCW4gPSBOTUFYOwoJCW1pbml0KG4pOwoJCW1wcmludChuKTsKCQlzdGQ6OmNvdXQgPDwgbXNxdWFyZW9uZXMobikgPDwgJ1xuJzsKCX0KCXJldHVybiAwOwp9