#include <iostream>
#include <vector>
#include <map>
using namespace std;
// funkcja skracająca ułamek
long long gcd(long long a, long long b) {
while (b) swap(a %= b, b);
return a;
}
int main() {
long long a, b;
cout << "Podaj licznik a i mianownik b (ułamek właściwy a < b): ";
cin >> a >> b;
long long g = gcd(a, b);
a /= g;
b /= g;
cout << "Ułamek nieskracalny: " << a << "/" << b << endl;
// rozwinięcie binarne
vector<int> digits;
map<long long, int> seen;
long long num = a;
int pos = 0;
int start_period = -1;
while (true) {
if (seen.count(num)) {
start_period = seen[num];
break;
}
seen[num] = pos;
num *= 2;
digits.push_back(num / b);
num %= b;
if (num == 0) break; // rozwinięcie skończone (gdyby doszło do takiej sytuacji)
pos++;
}
// wypisanie wyniku
cout << "Rozwinięcie binarne: 0.";
if (start_period == -1) {
// przypadek skończony (teoretycznie nie wystąpi dla b nie będącego potęgą 2)
for (int d : digits) cout << d;
cout << endl;
} else {
// wypisujemy część nieokresową
for (int i = 0; i < start_period; i++)
cout << digits[i];
cout << "(";
// część okresowa
for (int i = start_period; i < digits.size(); i++)
cout << digits[i];
cout << ")" << endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWFwPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8gZnVua2NqYSBza3JhY2FqxIVjYSB1xYJhbWVrCmxvbmcgbG9uZyBnY2QobG9uZyBsb25nIGEsIGxvbmcgbG9uZyBiKSB7CiAgICB3aGlsZSAoYikgc3dhcChhICU9IGIsIGIpOwogICAgcmV0dXJuIGE7Cn0KCmludCBtYWluKCkgewogICAgbG9uZyBsb25nIGEsIGI7CiAgICBjb3V0IDw8ICJQb2RhaiBsaWN6bmlrIGEgaSBtaWFub3duaWsgYiAodcWCYW1layB3xYJhxZtjaXd5IGEgPCBiKTogIjsKICAgIGNpbiA+PiBhID4+IGI7CgogICAgbG9uZyBsb25nIGcgPSBnY2QoYSwgYik7CiAgICBhIC89IGc7CiAgICBiIC89IGc7CgogICAgY291dCA8PCAiVcWCYW1layBuaWVza3JhY2Fsbnk6ICIgPDwgYSA8PCAiLyIgPDwgYiA8PCBlbmRsOwoKICAgIC8vIHJvendpbmnEmWNpZSBiaW5hcm5lCiAgICB2ZWN0b3I8aW50PiBkaWdpdHM7CiAgICBtYXA8bG9uZyBsb25nLCBpbnQ+IHNlZW47CgogICAgbG9uZyBsb25nIG51bSA9IGE7CiAgICBpbnQgcG9zID0gMDsKICAgIGludCBzdGFydF9wZXJpb2QgPSAtMTsKCiAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIGlmIChzZWVuLmNvdW50KG51bSkpIHsKICAgICAgICAgICAgc3RhcnRfcGVyaW9kID0gc2VlbltudW1dOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgc2VlbltudW1dID0gcG9zOwoKICAgICAgICBudW0gKj0gMjsKICAgICAgICBkaWdpdHMucHVzaF9iYWNrKG51bSAvIGIpOwogICAgICAgIG51bSAlPSBiOwoKICAgICAgICBpZiAobnVtID09IDApIGJyZWFrOyAvLyByb3p3aW5pxJljaWUgc2tvxYRjem9uZSAoZ2R5YnkgZG9zesWCbyBkbyB0YWtpZWogc3l0dWFjamkpCiAgICAgICAgcG9zKys7CiAgICB9CgogICAgLy8gd3lwaXNhbmllIHd5bmlrdQogICAgY291dCA8PCAiUm96d2luacSZY2llIGJpbmFybmU6IDAuIjsKCiAgICBpZiAoc3RhcnRfcGVyaW9kID09IC0xKSB7CiAgICAgICAgLy8gcHJ6eXBhZGVrIHNrb8WEY3pvbnkgKHRlb3JldHljem5pZSBuaWUgd3lzdMSFcGkgZGxhIGIgbmllIGLEmWTEhWNlZ28gcG90xJlnxIUgMikKICAgICAgICBmb3IgKGludCBkIDogZGlnaXRzKSBjb3V0IDw8IGQ7CiAgICAgICAgY291dCA8PCBlbmRsOwogICAgfSBlbHNlIHsKICAgICAgICAvLyB3eXBpc3VqZW15IGN6xJnFm8SHIG5pZW9rcmVzb3fEhQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhcnRfcGVyaW9kOyBpKyspCiAgICAgICAgICAgIGNvdXQgPDwgZGlnaXRzW2ldOwoKICAgICAgICBjb3V0IDw8ICIoIjsKCiAgICAgICAgLy8gY3rEmcWbxIcgb2tyZXNvd2EKICAgICAgICBmb3IgKGludCBpID0gc3RhcnRfcGVyaW9kOyBpIDwgZGlnaXRzLnNpemUoKTsgaSsrKQogICAgICAgICAgICBjb3V0IDw8IGRpZ2l0c1tpXTsKCiAgICAgICAgY291dCA8PCAiKSIgPDwgZW5kbDsKICAgIH0KCiAgICByZXR1cm4gMDsKfQo=