#include <iostream>
#include <map>
using namespace std;
using int64 = long long;
// NWD
int64 gcd(int64 a, int64 b) {
while (b != 0) {
int64 r = a % b;
a = b;
b = r;
}
return a;
}
// sprawdzenie potegi dwojki
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 0;
}
// skracanie ulamka
int64 g = gcd(llabs(num), den);
num /= g;
den /= g;
// warunek: mianownik NIE moze byc potega 2
if (isPowerOfTwo(den)) {
cout << "Mianownik NIE moze byc potega liczby 2!\n";
return 0;
}
cout << "Rozwiniecie binarne: 0.";
map<int64, int> visited;
string result = "";
int64 rest = llabs(num % den);
int pos = 0;
int startPeriod = -1;
while (rest != 0) {
if (visited.count(rest)) {
startPeriod = visited[rest];
break;
}
visited[rest] = pos++;
rest *= 2;
if (rest >= den) {
result += '1';
rest -= den;
} else {
result += '0';
}
}
// 출력
if (startPeriod == -1) {
cout << result << endl;
} else {
for (int i = 0; i < result.size(); i++) {
if (i == startPeriod) cout << "(";
cout << result[i];
}
cout << ")" << endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBpbnQ2NCA9IGxvbmcgbG9uZzsKCi8vIE5XRAppbnQ2NCBnY2QoaW50NjQgYSwgaW50NjQgYikgewogICAgd2hpbGUgKGIgIT0gMCkgewogICAgICAgIGludDY0IHIgPSBhICUgYjsKICAgICAgICBhID0gYjsKICAgICAgICBiID0gcjsKICAgIH0KICAgIHJldHVybiBhOwp9CgovLyBzcHJhd2R6ZW5pZSBwb3RlZ2kgZHdvamtpCmJvb2wgaXNQb3dlck9mVHdvKGludDY0IG4pIHsKICAgIHJldHVybiBuID4gMCAmJiAoKG4gJiAobiAtIDEpKSA9PSAwKTsKfQoKaW50IG1haW4oKSB7CiAgICBpbnQ2NCBudW0sIGRlbjsKICAgIGNvdXQgPDwgIlBvZGFqIGxpY3puaWsgaSBtaWFub3duaWs6ICI7CiAgICBjaW4gPj4gbnVtID4+IGRlbjsKCiAgICBpZiAoZGVuIDw9IDApIHsKICAgICAgICBjb3V0IDw8ICJCbGFkOiBtaWFub3duaWsgbXVzaSBieWMgZG9kYXRuaVxuIjsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvLyBza3JhY2FuaWUgdWxhbWthCiAgICBpbnQ2NCBnID0gZ2NkKGxsYWJzKG51bSksIGRlbik7CiAgICBudW0gLz0gZzsKICAgIGRlbiAvPSBnOwoKICAgIC8vIHdhcnVuZWs6IG1pYW5vd25payBOSUUgbW96ZSBieWMgcG90ZWdhIDIKICAgIGlmIChpc1Bvd2VyT2ZUd28oZGVuKSkgewogICAgICAgIGNvdXQgPDwgIk1pYW5vd25payBOSUUgbW96ZSBieWMgcG90ZWdhIGxpY3pieSAyIVxuIjsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBjb3V0IDw8ICJSb3p3aW5pZWNpZSBiaW5hcm5lOiAwLiI7CgogICAgbWFwPGludDY0LCBpbnQ+IHZpc2l0ZWQ7CiAgICBzdHJpbmcgcmVzdWx0ID0gIiI7CgogICAgaW50NjQgcmVzdCA9IGxsYWJzKG51bSAlIGRlbik7CiAgICBpbnQgcG9zID0gMDsKICAgIGludCBzdGFydFBlcmlvZCA9IC0xOwoKICAgIHdoaWxlIChyZXN0ICE9IDApIHsKICAgICAgICBpZiAodmlzaXRlZC5jb3VudChyZXN0KSkgewogICAgICAgICAgICBzdGFydFBlcmlvZCA9IHZpc2l0ZWRbcmVzdF07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgdmlzaXRlZFtyZXN0XSA9IHBvcysrOwogICAgICAgIHJlc3QgKj0gMjsKCiAgICAgICAgaWYgKHJlc3QgPj0gZGVuKSB7CiAgICAgICAgICAgIHJlc3VsdCArPSAnMSc7CiAgICAgICAgICAgIHJlc3QgLT0gZGVuOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc3VsdCArPSAnMCc7CiAgICAgICAgfQogICAgfQoKICAgIC8vIOy2nOugpQogICAgaWYgKHN0YXJ0UGVyaW9kID09IC0xKSB7CiAgICAgICAgY291dCA8PCByZXN1bHQgPDwgZW5kbDsKICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgaWYgKGkgPT0gc3RhcnRQZXJpb2QpIGNvdXQgPDwgIigiOwogICAgICAgICAgICBjb3V0IDw8IHJlc3VsdFtpXTsKICAgICAgICB9CiAgICAgICAgY291dCA8PCAiKSIgPDwgZW5kbDsKICAgIH0KCiAgICByZXR1cm4gMDsKfQo=