#include #include #include using namespace std; struct zaz { int num, steps; zaz(int a, int b) {num=a; steps=b;} bool operator<(const zaz &z) const {return num A, B; int main() { A.clear(); B.clear(); while(1) { bool jejednaA=false, jejednaB=false; int krokyA, krokyB; int puvA, puvB; int cisloA, cisloB; scanf("%d %d", &cisloA, &cisloB); puvA=cisloA; puvB=cisloB; if(cisloA==0 && cisloB==0) break; if(cisloA==1) {jejednaA=true; A.insert(zaz(1, 0)); krokyA=0;} if(cisloB==1) {jejednaB=true; B.insert(zaz(1, 0)); krokyB=0;} if(cisloA>1) A.insert(zaz(cisloA, 0)); if(cisloB>1) B.insert(zaz(cisloB, 0)); int step=0; while(cisloA>1 || cisloB>1) { if(B.find(zaz(cisloA, -1))!=B.end()) { int wx; if(cisloA==1) wx=krokyA; else wx=step; printf("%d needs %d steps, %d needs %d steps, they meet at %d\n", puvA, wx, puvB, B.find(zaz(cisloA, -1))->steps, cisloA); A.clear(); B.clear(); goto dalsi; } if(A.find(zaz(cisloB, -1))!=A.end()) { int wx; if(cisloB==1) wx=krokyB; else wx=step; printf("%d needs %d steps, %d needs %d steps, they meet at %d\n", puvA, A.find(zaz(cisloB, -1))->steps, puvB, wx, cisloB); A.clear(); B.clear(); goto dalsi; } if(cisloA>1) {if(cisloA%2==0) cisloA=cisloA/2; else cisloA=3*cisloA+1;} if(cisloB>1) {if(cisloB%2==0) cisloB=cisloB/2; else cisloB=3*cisloB+1;} step++; if(!jejednaA && cisloA==1) {jejednaA=true; A.insert(zaz(1, step)); krokyA=step;} if(!jejednaB && cisloB==1) {jejednaB=true; B.insert(zaz(1, step)); krokyB=step;} if(cisloA>1) A.insert(zaz(cisloA, step)); if(cisloB>1) B.insert(zaz(cisloB, step)); } if(B.find(zaz(cisloA, -1))!=B.end()) { int wx; if(cisloA==1) wx=krokyA; else wx=step; printf("%d needs %d steps, %d needs %d steps, they meet at %d\n", puvA, wx, puvB, B.find(zaz(cisloA, -1))->steps, cisloA); A.clear(); B.clear(); goto dalsi; } if(A.find(zaz(cisloB, -1))!=A.end()) { int wx; if(cisloB==1) wx=krokyB; else wx=step; printf("%d needs %d steps, %d needs %d steps, they meet at %d\n", puvA, A.find(zaz(cisloB, -1))->steps, puvB, wx, cisloB); A.clear(); B.clear(); goto dalsi; } dalsi: ; } return 0; }