Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define REP(i, a, b) for(int i = a; i < b; i++)
- const int maxn = 5000;
- const int maxrj = 10000;
- const int inf = 1e9;
- const int logn = 15;
- int t;
- int n, w, m;
- vector <vector <bool> > rj;
- vector <bool> nule;
- int pot[logn];
- char ispis[maxn];
- int ostalo[maxn];
- vector <pair <int, int> > svi;
- vector <int> jedinice;
- inline bool ok(char c)
- {
- if(c >= '0' && c <= '9') return 1;
- return 0;
- }
- inline int input()
- {
- int ret = 0;
- char c;
- while(!ok(c = getchar()));
- ret = c - '0';
- while(ok(c = getchar()))
- {
- ret *= 10;
- ret += c - '0';
- }
- return ret;
- }
- inline void sporo()
- {
- int vr0, vr1;
- bool odluka;
- int dodaj;
- REP(i, 1, n)
- {
- REP(j, 0, i) ostalo[j] = 2 * w + 1;
- REP(j, 0, (int)rj.size())
- {
- vr0 = 0;
- vr1 = 0;
- REP(k, 0, i)
- {
- if(rj[j][k]) vr0 += ostalo[k];
- else vr1 += ostalo[k];
- }
- if(vr1 != 0 && vr1 >= vr0)
- {
- rj[j].push_back(1);
- odluka = 1;
- }
- else
- {
- rj[j].push_back(0);
- odluka = 0;
- }
- REP(k, 0, i)
- {
- if(rj[j][k] != odluka && ostalo[k]) ostalo[k]--;
- }
- }
- dodaj = 0;
- REP(j, 0, i)
- {
- if(ostalo[j] > dodaj) dodaj = ostalo[j];
- }
- while((int)nule.size() < i) nule.push_back(0);
- REP(j, 0, dodaj)
- {
- rj.push_back(nule);
- rj.back().push_back(1);
- }
- }
- printf("%d\n", (int)rj.size());
- REP(i, 0, (int)rj.size())
- {
- REP(j, 0, n)
- {
- if(rj[i][j]) putchar('1');
- else putchar('0');
- }
- putchar('\n');
- }
- return;
- }
- inline void ispisi(int trpot, vector <int> koji, int kolko)
- {
- REP(i, 0, kolko)
- {
- bool trb = 1;
- REP(j, 0, n)
- {
- if(j % pot[trpot] == 0) trb = !trb;
- REP(k, 0, (int)koji.size())
- {
- if((i & (1<<k)) && j % pot[koji[k]] == 0) trb = !trb;
- }
- if(trb) putchar('1');
- else putchar('0');
- }
- putchar('\n');
- }
- return;
- }
- inline void brute()
- {
- svi.clear();
- jedinice.clear();
- int svis = 0, jedinices = 0;
- int trlogn = 0;
- while(n > pot[trlogn]) trlogn++;
- REP(i, 0, trlogn)
- {
- ostalo[i] = 2 * w + 1;
- svi.push_back(make_pair(ostalo[i], i));
- svis++;
- }
- int rj = 0;
- int kolko;
- int dg = 0;
- vector <int> koji;
- vector <int> prazan;
- REP(i, 0, trlogn)
- {
- //svi.erase(svi.begin(), svi.begin() + 1);
- dg++;
- svis--;
- if(ostalo[i] == 1)
- {
- ostalo[i] -= 1;
- rj += 1;
- }
- while(ostalo[i] > 0)
- {
- kolko = 6; //optimiziraj
- while(!(svis + jedinices >= kolko && ostalo[i] >= pot[kolko])) kolko--;
- ostalo[i] -= pot[kolko];
- koji.clear();
- int ind = (int)svi.size() - 1;
- REP(j, 0, kolko)
- {
- if(ind >= dg)
- {
- koji.push_back(svi[ind].second);
- ostalo[svi[ind].second] -= pot[kolko - 1];
- if(ostalo[svi[ind].second] <= 0)
- {
- svi.pop_back();
- svis--;
- }
- else
- {
- svi[ind].first = ostalo[svi[ind].second];
- }
- ind--;
- }
- else
- {
- koji.push_back(jedinice.back());
- ostalo[jedinice.back()] -= pot[kolko - 1];
- jedinice.pop_back();
- jedinices--;
- }
- }
- rj += pot[kolko];
- }
- }
- printf("%d\n", rj);
- dg = 0;
- svis = 0;
- jedinices = 0;
- svi.clear();
- jedinice.clear();
- REP(i, 0, trlogn)
- {
- ostalo[i] = 2 * w + 1;
- svi.push_back(make_pair(ostalo[i], i));
- svis++;
- }
- koji.clear();
- REP(i, 0, trlogn)
- {
- //svi.erase(svi.begin(), svi.begin() + 1);
- dg++;
- svis--;
- if(ostalo[i] == 1)
- {
- ostalo[i] -= 1;
- ispisi(i, prazan, 1);
- }
- while(ostalo[i] > 0)
- {
- kolko = 6; //optimiziraj
- while(!(svis + jedinices >= kolko && ostalo[i] >= pot[kolko])) kolko--;
- ostalo[i] -= pot[kolko];
- koji.clear();
- int ind = (int)svi.size() - 1;
- REP(j, 0, kolko)
- {
- if(ind >= dg)
- {
- koji.push_back(svi[ind].second);
- ostalo[svi[ind].second] -= pot[kolko - 1];
- if(ostalo[svi[ind].second] <= 0)
- {
- svi.pop_back();
- svis--;
- }
- else
- {
- svi[ind].first = ostalo[svi[ind].second];
- }
- ind--;
- }
- else
- {
- koji.push_back(jedinice.back());
- ostalo[jedinice.back()] -= pot[kolko - 1];
- jedinice.pop_back();
- jedinices--;
- }
- }
- ispisi(i, koji, pot[kolko]);
- }
- }
- return;
- }
- inline void precalc()
- {
- pot[0] = 1;
- REP(i, 1, logn) pot[i] = pot[i - 1] * 2;
- return;
- }
- int main()
- {
- precalc();
- scanf("%d", &t);
- REP(tt, 0, t)
- {
- //ocisti sve
- rj.clear();
- nule.clear();
- n = input();
- w = input();
- m = input();
- if(n * w < 3000 || n < 901)
- {
- sporo();
- continue;
- }
- else
- {
- brute();
- continue;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement