#include #include #include void oblicz(char* str, int P) { int x = 0, p = 1; for(int i = strlen(str)-1; i >= 0; i--, p *= (-P)) x += (str[i]-'0')*p; printf("%d\n", x); } int zakres(int minim, int maxim, int l) { if(l < minim) return -1; if(l > maxim) return 1; return 0; } void oblicz(int L, int P) { int tmin[30], tmax[30]; tmin[0] = 0, tmax[0] = (P-1); int i = 0, p = 1, x, sum; while(zakres(tmin[i], tmax[i], L)) { i++; p *= (-P); tmin[i] = tmin[i-1]; tmax[i] = tmax[i-1]; if(i%2) tmin[i] += (P-1)*p; else tmax[i] += (P-1)*p; } while(i > 0) { if(zakres(tmin[i-1], tmax[i-1], L) < 0) { // bylo powiekszenie w lewo sum = L-tmin[i-1]; x = (sum+p+1)/p; } else { // bylo powiekszenie w prawo sum = (L-tmax[i-1]); sum += p-1; x = sum/p; } i--; L -= x*p; p /= (-P); printf("%d", x); } printf("%d\n", L); } int main() { char str[100]; int P, L; while(1) { scanf("%s", str); switch(str[0]) { case 't': P = atoi(str+3); scanf("%d", &L); oblicz(L, P); break; case 'f': P = atoi(str+5); scanf("%s", str); // printf("f\n"); oblicz(str, P); break; case 'e': return 0; } } return 0; }