#include <iostream>
#include <map>
using namespace std;
using int64 = long long;
int64 gcd(int64 a, int64 b) {
while (b != 0) {
int64 r = a % b;
a = b;
b = r;
}
return a;
}
bool isPowerOfTwo(int64 n) {
return n > 0 && ((n & (n - 1)) == 0);
}
int main() {
int64 num, den;
cout << "Podaj licznik i mianownik: ";
cin >> num >> den;
if (den <= 0) {
cout << "Blad: mianownik musi byc dodatni\n";
return 1;
}
// skracanie ulamka
int64 g = gcd(llabs(num), den);
num /= g;
den /= g;
// ma NIE byc potega dwojki
if (isPowerOfTwo(den)) {
cout << "Mianownik NIE moze byc potega dwojki!\n";
return 1;
}
cout << "Rozwiniecie binarne: 0.";
// mapujemy reszta -> pozycja w wyniku
map<int64, int> seen;
string result = "";
int64 remainder = num % den;
int pos = 0;
int startPeriod = -1;
while (remainder != 0) {
if (seen.count(remainder)) {
// znaleziono okres
startPeriod = seen[remainder];
break;
}
seen[remainder] = pos++;
remainder *= 2;
if (remainder >= den) {
result += '1';
remainder -= den;
} else {
result += '0';
}
}
// wypisanie
if (startPeriod == -1) {
// przypadek rzadki: mimo wszystko skończone
cout << result << endl;
} else {
for (int i = 0; i < result.size(); i++) {
if (i == startPeriod) cout << "(";
cout << result[i];
}
cout << ")" << endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBpbnQ2NCA9IGxvbmcgbG9uZzsKCmludDY0IGdjZChpbnQ2NCBhLCBpbnQ2NCBiKSB7CiAgICB3aGlsZSAoYiAhPSAwKSB7CiAgICAgICAgaW50NjQgciA9IGEgJSBiOwogICAgICAgIGEgPSBiOwogICAgICAgIGIgPSByOwogICAgfQogICAgcmV0dXJuIGE7Cn0KCmJvb2wgaXNQb3dlck9mVHdvKGludDY0IG4pIHsKICAgIHJldHVybiBuID4gMCAmJiAoKG4gJiAobiAtIDEpKSA9PSAwKTsKfQoKaW50IG1haW4oKSB7CiAgICBpbnQ2NCBudW0sIGRlbjsKICAgIGNvdXQgPDwgIlBvZGFqIGxpY3puaWsgaSBtaWFub3duaWs6ICI7CiAgICBjaW4gPj4gbnVtID4+IGRlbjsKCiAgICBpZiAoZGVuIDw9IDApIHsKICAgICAgICBjb3V0IDw8ICJCbGFkOiBtaWFub3duaWsgbXVzaSBieWMgZG9kYXRuaVxuIjsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAvLyBza3JhY2FuaWUgdWxhbWthCiAgICBpbnQ2NCBnID0gZ2NkKGxsYWJzKG51bSksIGRlbik7CiAgICBudW0gLz0gZzsKICAgIGRlbiAvPSBnOwoKICAgIC8vIG1hIE5JRSBieWMgcG90ZWdhIGR3b2praQogICAgaWYgKGlzUG93ZXJPZlR3byhkZW4pKSB7CiAgICAgICAgY291dCA8PCAiTWlhbm93bmlrIE5JRSBtb3plIGJ5YyBwb3RlZ2EgZHdvamtpIVxuIjsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBjb3V0IDw8ICJSb3p3aW5pZWNpZSBiaW5hcm5lOiAwLiI7CgogICAgLy8gbWFwdWplbXkgcmVzenRhIC0+IHBvenljamEgdyB3eW5pa3UKICAgIG1hcDxpbnQ2NCwgaW50PiBzZWVuOwogICAgc3RyaW5nIHJlc3VsdCA9ICIiOwoKICAgIGludDY0IHJlbWFpbmRlciA9IG51bSAlIGRlbjsKICAgIGludCBwb3MgPSAwOwogICAgaW50IHN0YXJ0UGVyaW9kID0gLTE7CgogICAgd2hpbGUgKHJlbWFpbmRlciAhPSAwKSB7CiAgICAgICAgaWYgKHNlZW4uY291bnQocmVtYWluZGVyKSkgewogICAgICAgICAgICAvLyB6bmFsZXppb25vIG9rcmVzCiAgICAgICAgICAgIHN0YXJ0UGVyaW9kID0gc2VlbltyZW1haW5kZXJdOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIHNlZW5bcmVtYWluZGVyXSA9IHBvcysrOwogICAgICAgIHJlbWFpbmRlciAqPSAyOwoKICAgICAgICBpZiAocmVtYWluZGVyID49IGRlbikgewogICAgICAgICAgICByZXN1bHQgKz0gJzEnOwogICAgICAgICAgICByZW1haW5kZXIgLT0gZGVuOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc3VsdCArPSAnMCc7CiAgICAgICAgfQogICAgfQoKICAgIC8vIHd5cGlzYW5pZQogICAgaWYgKHN0YXJ0UGVyaW9kID09IC0xKSB7CiAgICAgICAgLy8gcHJ6eXBhZGVrIHJ6YWRraTogbWltbyB3c3p5c3RrbyBza2/FhGN6b25lCiAgICAgICAgY291dCA8PCByZXN1bHQgPDwgZW5kbDsKICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgaWYgKGkgPT0gc3RhcnRQZXJpb2QpIGNvdXQgPDwgIigiOwogICAgICAgICAgICBjb3V0IDw8IHJlc3VsdFtpXTsKICAgICAgICB9CiAgICAgICAgY291dCA8PCAiKSIgPDwgZW5kbDsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoK