// @BEGIN_OF_SOURCE_CODE /* @JUDGE_ID: 17243NT 107 C++ "exp(log(n) / p)" */ /* Send to judge@uva.es */ #include #include int gcf(int a, int b); int multidivide(int &n, int p); int main() { int n, i; int m1, p1; int m2, p2; int work, init; int power; int a1, a2; while(scanf("%d %d", &init, &work) == 2) { if(init < 1 || work < 1) break; m1 = init; p1 = multidivide(m1, 2); for(i = 3; i <= m1; i++) { if(m1 % i == 0) { if(p1 > 0) { p1 = gcf(multidivide(m1, i), p1); } else { p1 = multidivide(m1, i); } } } m2 = work; p2 = multidivide(m2, 2); for(i = 3; i <= m2; i++) { if(m2 % i == 0) { if(p2 > 0) { p2 = gcf(multidivide(m2, i), p2); } else { p2 = multidivide(m2, i); } } } if(work == 1) power = p1; else power = gcf(p1, p2); n = (int) (exp(log(init) / power) + .1); // .1 added to offset minor rounding errors // (always do this when working with logarithms) a1 = 0; a2 = work; work = 1; for(i = 0; i < power; i++) { a1 += work; a2 += init * work; work *= n - 1; init /= n; } printf("%d %d\n", a1, a2); } return 0; } int multidivide(int &n, int p) { int pow = 0; while(n % p == 0) n /= p, pow++; return pow; } int gcf(int a, int b) { int t; while(a > 0) { if(a < b) { t = a; a = b; b = t; } a = a % b; } return b; } // @END_OF_SOURCE_CODE