I submit two variations of code to judge - first solution terminates if p == 0, second does not make this check. First solution gets WA (I think because p == 0). Second - TLE (my solution runs forever, if p == 0).
I think problem here is with my input method. Can anybody find an input that will cause my code to run forever or print WA? Input should follow input rules provided in problem description
http://acm.uva.es/p/v1/113.html.
One more time: my code is sure that first judge's input for p is 0...
By the way, my solution solves samples correctly.
[cpp]#include <iostream.h>
#include <stdio.h>
const unsigned long base = 10000;
const unsigned long N = 100;
struct my_long{
unsigned long digit[N];
};
my_long incr[N*8];
int lll(my_long in){
int i = N;
while((!in.digit
)&&(i > 0)) i--;
return i;
}
void print(my_long &ml){
int i = N - 1;
while((!ml.digit) && (i > 0)) i--;
cout << ml.digit;
i--;
while(i >= 0){
if(ml.digit < 1000) cout << "0";
if(ml.digit < 100) cout << "0";
if(ml.digit < 10) cout << "0";
cout << ml.digit;
i--;
};
cout << endl;
}
void shift(my_long &ml){
for(int i = 0; i < N; i++){
ml.digit[i + 1] += ml.digit/base;
ml.digit %= base;
}
}
void add(my_long &ml, unsigned long in){
ml.digit[0] += in;
shift(ml);
}
void add(my_long &in1, my_long &in2){
for(int i = 0; i < N; i++) in1.digit += in2.digit[i];
shift(in1);
}
void mult(my_long &ml, unsigned long in){
for(int i = 0; i < N; i++) ml.digit[i] *= in;
shift(ml);
}
void move_left(my_long &ml, int in){
int i;
for(i = N - 1; i >= in; i--) ml.digit[i] = ml.digit[i - in];
for(i = i; i >= 0; i--) ml.digit[i] = 0;
}
void mult(my_long &in1, my_long in2){
my_long out;
for(int i = 0; i < N; i++) out.digit[i] = 0;
my_long temp;
for(int i = 0; i < (N/2 - 3); i++){
temp = in1;
mult(temp,in2.digit[i]);
move_left(temp,i);
add(out,temp);
}
in1 = out;
}
int power(my_long &n, int pow){
my_long temp;
temp = n;
for(int i = 1; i < pow; i++) mult(n,temp);
return 1;
}
void create_incr(){
my_long temp;
for(int i = 0; i < N; i++) temp.digit[i] = 0;
temp.digit[0] = 1;
for(int i = 0; i < N*8; i++){
incr[i] = temp;
mult(temp,3);
}
}
int less_or_equal(my_long in1, my_long in2){
for(int i = N - 1; i >= 0; i--){
if(in1.digit[i] < in2.digit[i]) return 1;
if(in1.digit[i] > in2.digit[i]) return 0;
}
return 1;
}
int equal(my_long in1, my_long in2){
for(int i = 0; i < N; i++) if(in1.digit[i]!=in2.digit[i]) return 0;
return 1;
}
my_long p,answer,temp;
unsigned long n;
char buffer[200];
void find_answer(){
int i,flag;
for(int i = 0; i < N; i++) temp.digit[i] = 0;
answer = temp;
while(1){
i = 0;
do{
temp = answer;
add(temp,incr[i]);
flag = power(temp,n);
if(equal(temp,p)){
add(answer,incr[i]);
print(answer);
return;
}
i++;
}while((less_or_equal(temp,p))&&(flag));
add(answer,incr[i - 2]);
}
}
int main(){
int k;
create_incr();
while(cin >> n){
gets(buffer);
k = 0;
for(int i = 0; i < N; i++) p.digit[i] = 0;
while(buffer[k]){
mult(p,10);
add(p,buffer[k] - 48 );
k++;
}
if((p.digit[0] == 0)&&(lll(p) < 1)) return 0; //This line checks if p == 0 *********
find_answer();
}
return 0;
}[/cpp]