Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.30 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define REP(i, a, b) for(int i = a; i < b; i++)
  5.  
  6. const int maxn = 5000;
  7. const int maxrj = 10000;
  8. const int inf = 1e9;
  9. const int logn = 15;
  10.  
  11. int t;
  12.  
  13. int n, w, m;
  14.  
  15. vector <vector <bool> > rj;
  16. vector <bool> nule;
  17.  
  18. int pot[logn];
  19.  
  20. char ispis[maxn];
  21.  
  22. int ostalo[maxn];
  23.  
  24. vector <pair <int, int> > svi;
  25. vector <int> jedinice;
  26.  
  27. inline bool ok(char c)
  28. {
  29.     if(c >= '0' && c <= '9') return 1;
  30.     return 0;
  31. }
  32.  
  33. inline int input()
  34. {
  35.     int ret = 0;
  36.     char c;
  37.     while(!ok(c = getchar()));
  38.     ret = c - '0';
  39.     while(ok(c = getchar()))
  40.     {
  41.         ret *= 10;
  42.         ret += c - '0';
  43.     }
  44.     return ret;
  45. }
  46.  
  47. inline void sporo()
  48. {
  49.     int vr0, vr1;
  50.     bool odluka;
  51.     int dodaj;
  52.     REP(i, 1, n)
  53.     {
  54.         REP(j, 0, i) ostalo[j] = 2 * w + 1;
  55.         REP(j, 0, (int)rj.size())
  56.         {
  57.             vr0 = 0;
  58.             vr1 = 0;
  59.             REP(k, 0, i)
  60.             {
  61.                 if(rj[j][k]) vr0 += ostalo[k];
  62.                 else vr1 += ostalo[k];
  63.             }
  64.             if(vr1 != 0 && vr1 >= vr0)
  65.             {
  66.                 rj[j].push_back(1);
  67.                 odluka = 1;
  68.             }
  69.             else
  70.             {
  71.                 rj[j].push_back(0);
  72.                 odluka = 0;
  73.             }
  74.             REP(k, 0, i)
  75.             {
  76.                 if(rj[j][k] != odluka && ostalo[k]) ostalo[k]--;
  77.             }
  78.         }
  79.         dodaj = 0;
  80.         REP(j, 0, i)
  81.         {
  82.             if(ostalo[j] > dodaj) dodaj = ostalo[j];
  83.         }
  84.         while((int)nule.size() < i) nule.push_back(0);
  85.         REP(j, 0, dodaj)
  86.         {
  87.             rj.push_back(nule);
  88.             rj.back().push_back(1);
  89.         }
  90.     }
  91.     printf("%d\n", (int)rj.size());
  92.     REP(i, 0, (int)rj.size())
  93.     {
  94.         REP(j, 0, n)
  95.         {
  96.             if(rj[i][j]) putchar('1');
  97.             else putchar('0');
  98.         }
  99.         putchar('\n');
  100.     }
  101.     return;
  102. }
  103.  
  104. inline void ispisi(int trpot, vector <int> koji, int kolko)
  105. {
  106.     REP(i, 0, kolko)
  107.     {
  108.         bool trb = 1;
  109.         REP(j, 0, n)
  110.         {
  111.             if(j % pot[trpot] == 0) trb = !trb;
  112.             REP(k, 0, (int)koji.size())
  113.             {
  114.                 if((i & (1<<k)) && j % pot[koji[k]] == 0) trb = !trb;
  115.             }
  116.             if(trb) putchar('1');
  117.             else putchar('0');
  118.         }
  119.         putchar('\n');
  120.     }
  121.     return;
  122. }
  123.  
  124. inline void brute()
  125. {
  126.     svi.clear();
  127.     jedinice.clear();
  128.     int svis = 0, jedinices = 0;
  129.     int trlogn = 0;
  130.     while(n > pot[trlogn]) trlogn++;
  131.     REP(i, 0, trlogn)
  132.     {
  133.         ostalo[i] = 2 * w + 1;
  134.         svi.push_back(make_pair(ostalo[i], i));
  135.         svis++;
  136.     }
  137.     int rj = 0;
  138.     int kolko;
  139.     int dg = 0;
  140.     vector <int> koji;
  141.     vector <int> prazan;
  142.     REP(i, 0, trlogn)
  143.     {
  144.         //svi.erase(svi.begin(), svi.begin() + 1);
  145.         dg++;
  146.         svis--;
  147.         if(ostalo[i] == 1)
  148.         {
  149.             ostalo[i] -= 1;
  150.             rj += 1;
  151.         }
  152.         while(ostalo[i] > 0)
  153.         {
  154.             kolko = 6; //optimiziraj
  155.             while(!(svis + jedinices >= kolko && ostalo[i] >= pot[kolko])) kolko--;
  156.             ostalo[i] -= pot[kolko];
  157.             koji.clear();
  158.             int ind = (int)svi.size() - 1;
  159.             REP(j, 0, kolko)
  160.             {
  161.                 if(ind >= dg)
  162.                 {
  163.                     koji.push_back(svi[ind].second);
  164.                     ostalo[svi[ind].second] -= pot[kolko - 1];
  165.                     if(ostalo[svi[ind].second] <= 0)
  166.                     {
  167.                          svi.pop_back();
  168.                          svis--;
  169.                     }
  170.                     else
  171.                     {
  172.                         svi[ind].first = ostalo[svi[ind].second];
  173.                     }
  174.                     ind--;
  175.                 }
  176.                 else
  177.                 {
  178.                     koji.push_back(jedinice.back());
  179.                     ostalo[jedinice.back()] -= pot[kolko - 1];
  180.                     jedinice.pop_back();
  181.                     jedinices--;
  182.                 }
  183.             }
  184.             rj += pot[kolko];
  185.         }
  186.     }
  187.     printf("%d\n", rj);
  188.     dg = 0;
  189.     svis = 0;
  190.     jedinices = 0;
  191.     svi.clear();
  192.     jedinice.clear();
  193.     REP(i, 0, trlogn)
  194.     {
  195.         ostalo[i] = 2 * w + 1;
  196.         svi.push_back(make_pair(ostalo[i], i));
  197.         svis++;
  198.     }
  199.     koji.clear();
  200.     REP(i, 0, trlogn)
  201.     {
  202.         //svi.erase(svi.begin(), svi.begin() + 1);
  203.         dg++;
  204.         svis--;
  205.         if(ostalo[i] == 1)
  206.         {
  207.             ostalo[i] -= 1;
  208.             ispisi(i, prazan, 1);
  209.         }
  210.         while(ostalo[i] > 0)
  211.         {
  212.             kolko = 6; //optimiziraj
  213.             while(!(svis + jedinices >= kolko && ostalo[i] >= pot[kolko])) kolko--;
  214.             ostalo[i] -= pot[kolko];
  215.             koji.clear();
  216.             int ind = (int)svi.size() - 1;
  217.             REP(j, 0, kolko)
  218.             {
  219.                 if(ind >= dg)
  220.                 {
  221.                     koji.push_back(svi[ind].second);
  222.                     ostalo[svi[ind].second] -= pot[kolko - 1];
  223.                     if(ostalo[svi[ind].second] <= 0)
  224.                     {
  225.                         svi.pop_back();
  226.                         svis--;
  227.                     }
  228.                     else
  229.                     {
  230.                         svi[ind].first = ostalo[svi[ind].second];
  231.                     }
  232.                     ind--;
  233.                 }
  234.                 else
  235.                 {
  236.                     koji.push_back(jedinice.back());
  237.                     ostalo[jedinice.back()] -= pot[kolko - 1];
  238.                     jedinice.pop_back();
  239.                     jedinices--;
  240.                 }
  241.             }
  242.             ispisi(i, koji, pot[kolko]);
  243.         }
  244.     }
  245.     return;
  246. }
  247.  
  248. inline void precalc()
  249. {
  250.     pot[0] = 1;
  251.     REP(i, 1, logn) pot[i] = pot[i - 1] * 2;
  252.     return;
  253. }
  254.  
  255. int main()
  256. {
  257.     precalc();
  258.     scanf("%d", &t);
  259.     REP(tt, 0, t)
  260.     {
  261.         //ocisti sve
  262.         rj.clear();
  263.         nule.clear();
  264.         n = input();
  265.         w = input();
  266.         m = input();
  267.         if(n * w < 3000 || n < 901)
  268.         {
  269.             sporo();
  270.             continue;
  271.         }
  272.         else
  273.         {
  274.             brute();
  275.             continue;
  276.         }
  277.     }
  278.     return 0;
  279. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement