#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;
void wypisz_rozwiazanie(int* tab_wy, int j)
{
int licznik_G = 0, licznik_D = 0;
for (int i = 0; i <= j; i++) //znajdź ilość wystąpień pozycji przełącznika
{
if (tab_wy[i] == 1)
licznik_G++;
if (tab_wy[i] == -1)
licznik_D++;
}
cout << licznik_G << " ";
for (int i = 0; i <= j; i++) //wypisz pozycje G
{
if (tab_wy[i] == 1)
cout << i << " ";
}
cout << endl;
cout << licznik_D << " ";
for (int i = 0; i <= j; i++) //wypisz pozycje G
{
if (tab_wy[i] == -1)
cout << i << " ";
}
cout << endl;
}
//zwraca tab_wy[]: 1 na pozycji to G, 0 brak, -1 D; gdzie G=potęga+, D=potęga-
//przykłady: 5=-1-3+9 => [-1,-1,1]; 10=+1+0+9 => [1,0,1]
void szukaj_klucza(int x, int* tab_wy, int* tab_p, int j)
{
int pom1, pom2, pom3, znak, min, l_startowa;
l_startowa = tab_p[j];
tab_wy[j] = 1;
j--;
for (int i = j; i >= 0; i--)
{
//trzy przypadki co robimy z kolejną wartością potęgi -> szukamy różnicy najbliższej x
//i dla minimum ustawiamy znak -1 lub 0 lub 1
pom1 = l_startowa - tab_p[i]; pom2 = l_startowa + 0; pom3 = l_startowa + tab_p[i];
if (abs(pom1 - x) > abs(pom2 - x))
{
znak = 0, min = abs(pom2 - x), l_startowa = pom2;
}
else
{
znak = -1, min = abs(pom1 - x), l_startowa = pom1;
}
if (min > abs(pom3 - x))
znak = +1, l_startowa = pom3;
tab_wy[i] = znak;
}
}
int main()
{
int suma_poteg;
int l_zamkow = 20;
int *tab_p; //tablica kolejnych poteg liczby 3 o rozmiamrze ilosci zamkow
int *tab_s; //i sum ich poteg
int *tab_wy; //tablica ustawien przełacznków
//int t=1; //liczba haseł czyli testów
int t;
cin >> t;
int x=0; //liczba kodowana
int j; //liczba potęg potrzebnych z tablicy
tab_p = new int[l_zamkow];
tab_s = new int[l_zamkow];
tab_wy = new int[l_zamkow];
tab_s[0] = 0;
for (int i = 0; i < 20; i++) //klucze do 20-stu pozycji
{
tab_wy[i] = -100;
tab_s[i] = 0;
tab_p[i] = pow(3,(double)i);
if (i==0)
tab_s[i] += tab_p[i];
else
tab_s[i] = tab_s[i-1]+ tab_p[i];
}
for (int i = 0; i < t; i++) //ustala ile j sum potęg potrzeba do reprezenatacji danej liczby
{
j = 0; suma_poteg = 0;
cin >> x;
while (x > suma_poteg)
{
suma_poteg = tab_s[j];
j++;
}
--j;
szukaj_klucza(x, tab_wy, tab_p, j);
wypisz_rozwiazanie(tab_wy, j);
//cout << endl << j << endl;
}
delete [] tab_p;
delete [] tab_s;
delete [] tab_wy;
//system ("pause");
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWF0aC5oPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZvaWQgd3lwaXN6X3JvendpYXphbmllKGludCogdGFiX3d5LCBpbnQgaikKewogICAgaW50IGxpY3puaWtfRyA9IDAsIGxpY3puaWtfRCA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8PSBqOyBpKyspICAgICAgICAgICAgIC8vem5hamTFuiBpbG/Fm8SHIHd5c3TEhXBpZcWEIHBvenljamkgcHJ6ZcWCxIVjem5pa2EKICAgIHsKICAgICAgICBpZiAodGFiX3d5W2ldID09IDEpCiAgICAgICAgICAgIGxpY3puaWtfRysrOwogICAgICAgIGlmICh0YWJfd3lbaV0gPT0gLTEpCiAgICAgICAgICAgIGxpY3puaWtfRCsrOwogICAgfQogICAgY291dCA8PCBsaWN6bmlrX0cgPDwgIiAiOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gajsgaSsrKSAgICAgICAgICAgICAvL3d5cGlzeiBwb3p5Y2plIEcKICAgIHsKICAgICAgICBpZiAodGFiX3d5W2ldID09IDEpCiAgICAgICAgICAgIGNvdXQgPDwgaSA8PCAiICI7CiAgICB9CiAgICBjb3V0IDw8IGVuZGw7CiAgICBjb3V0IDw8IGxpY3puaWtfRCA8PCAiICI7CiAgICBmb3IgKGludCBpID0gMDsgaSA8PSBqOyBpKyspICAgICAgICAgICAgIC8vd3lwaXN6IHBvenljamUgRwogICAgewogICAgICAgIGlmICh0YWJfd3lbaV0gPT0gLTEpCiAgICAgICAgICAgIGNvdXQgPDwgaSA8PCAiICI7CiAgICB9CiAgICBjb3V0IDw8IGVuZGw7Cgp9CgovL3p3cmFjYSB0YWJfd3lbXTogMSBuYSBwb3p5Y2ppIHRvIEcsIDAgYnJhaywgLTEgRDsgZ2R6aWUgRz1wb3TEmWdhKywgRD1wb3TEmWdhLSAgCi8vcHJ6eWvFgmFkeTogNT0tMS0zKzkgPT4gWy0xLC0xLDFdOyAxMD0rMSswKzkgPT4gWzEsMCwxXSAgCnZvaWQgc3p1a2FqX2tsdWN6YShpbnQgeCwgaW50KiB0YWJfd3ksIGludCogdGFiX3AsIGludCBqKQp7CiAgICBpbnQgcG9tMSwgcG9tMiwgcG9tMywgem5haywgbWluLCBsX3N0YXJ0b3dhOwogICAgbF9zdGFydG93YSA9IHRhYl9wW2pdOwogICAgdGFiX3d5W2pdID0gMTsKICAgIGotLTsKICAgIGZvciAoaW50IGkgPSBqOyBpID49IDA7IGktLSkKICAgIHsKICAgICAgICAvL3RyenkgcHJ6eXBhZGtpIGNvIHJvYmlteSB6IGtvbGVqbsSFIHdhcnRvxZtjacSFIHBvdMSZZ2kgLT4gc3p1a2FteSByw7PFvG5pY3kgbmFqYmxpxbxzemVqIHgKICAgICAgICAvL2kgZGxhIG1pbmltdW0gdXN0YXdpYW15IHpuYWsgLTEgbHViIDAgbHViIDEgCiAgICAgICAgcG9tMSA9IGxfc3RhcnRvd2EgLSB0YWJfcFtpXTsgcG9tMiA9IGxfc3RhcnRvd2EgKyAwOyBwb20zID0gbF9zdGFydG93YSArIHRhYl9wW2ldOwogICAgICAgIGlmIChhYnMocG9tMSAtIHgpID4gYWJzKHBvbTIgLSB4KSkKICAgICAgICB7CiAgICAgICAgICAgIHpuYWsgPSAwLCBtaW4gPSBhYnMocG9tMiAtIHgpLCBsX3N0YXJ0b3dhID0gcG9tMjsKICAgICAgICB9CiAgICAgICAgZWxzZSAKICAgICAgICB7IAogICAgICAgICAgICB6bmFrID0gLTEsIG1pbiA9IGFicyhwb20xIC0geCksIGxfc3RhcnRvd2EgPSBwb20xOwogICAgICAgIH0KICAgICAgICBpZiAobWluID4gYWJzKHBvbTMgLSB4KSkKICAgICAgICAgICAgem5hayA9ICsxLCBsX3N0YXJ0b3dhID0gcG9tMzsKICAgICAgICB0YWJfd3lbaV0gPSB6bmFrOwogICAgfQp9CgoKaW50IG1haW4oKQp7CiAgICBpbnQgc3VtYV9wb3RlZzsKICAgIGludCBsX3phbWtvdyA9IDIwOwogICAgaW50ICp0YWJfcDsgICAgICAgICAgICAgICAgICAgICAgICAgLy90YWJsaWNhIGtvbGVqbnljaCBwb3RlZyBsaWN6YnkgMyBvIHJvem1pYW1yemUgaWxvc2NpIHphbWtvdyAKICAgIGludCAqdGFiX3M7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vaSBzdW0gaWNoIHBvdGVnCiAgICBpbnQgKnRhYl93eTsgICAgICAgICAgICAgICAgICAgICAgICAvL3RhYmxpY2EgdXN0YXdpZW4gcHJ6ZcWCYWN6bmvDs3cKICAgIC8vaW50IHQ9MTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbGljemJhIGhhc2XFgiBjenlsaSB0ZXN0w7N3CiAgICBpbnQgdDsgCiAgICBjaW4gPj4gdDsKICAgIGludCB4PTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbGljemJhIGtvZG93YW5hIAogICAgaW50IGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9saWN6YmEgcG90xJlnIHBvdHJ6ZWJueWNoIHogdGFibGljeSAKICAgIHRhYl9wID0gbmV3IGludFtsX3phbWtvd107CiAgICB0YWJfcyA9IG5ldyBpbnRbbF96YW1rb3ddOwogICAgdGFiX3d5ID0gbmV3IGludFtsX3phbWtvd107CiAgICB0YWJfc1swXSA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspICAgICAgICAvL2tsdWN6ZSBkbyAyMC1zdHUgcG96eWNqaSAKICAgIHsKICAgICAgICB0YWJfd3lbaV0gPSAtMTAwOwogICAgICAgIHRhYl9zW2ldID0gMDsKICAgICAgICB0YWJfcFtpXSA9IHBvdygzLChkb3VibGUpaSk7CiAgICAgICAgaWYgKGk9PTApCiAgICAgICAgICAgIHRhYl9zW2ldICs9IHRhYl9wW2ldOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdGFiX3NbaV0gPSB0YWJfc1tpLTFdKyB0YWJfcFtpXTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdDsgaSsrKSAgICAgICAgIC8vdXN0YWxhIGlsZSBqIHN1bSBwb3TEmWcgcG90cnplYmEgZG8gcmVwcmV6ZW5hdGFjamkgZGFuZWogbGljemJ5CiAgICB7CiAgICAgICAgaiA9IDA7IHN1bWFfcG90ZWcgPSAwOwogICAgICAgIGNpbiA+PiB4OwogICAgICAgIHdoaWxlICh4ID4gc3VtYV9wb3RlZykKICAgICAgICB7CiAgICAgICAgICAgIHN1bWFfcG90ZWcgPSB0YWJfc1tqXTsKICAgICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICAtLWo7CiAgICAgICAgc3p1a2FqX2tsdWN6YSh4LCB0YWJfd3ksIHRhYl9wLCBqKTsKICAgICAgICB3eXBpc3pfcm96d2lhemFuaWUodGFiX3d5LCBqKTsKICAgICAgICAvL2NvdXQgPDwgZW5kbCA8PCBqIDw8IGVuZGw7CiAgICB9CiAgICBkZWxldGUgW10gdGFiX3A7CiAgICBkZWxldGUgW10gdGFiX3M7CiAgICBkZWxldGUgW10gdGFiX3d5OwogICAgLy9zeXN0ZW0gKCJwYXVzZSIpOwogICAgcmV0dXJuIDA7IAp9