void abort() { };
                          
               
                                                                          
  
                        
                                                                                                                                                          
                                                                             
extern int __VERIFIER_nondet_int();
                        
/*@ 
    requires ((counter == 0));
    ensures (((\old(cond) != 0) && (counter == 0)));
@*/
void assume_abort_if_not(int cond) {
  if(!cond) {abort();}
}
/*@ 
    requires ((\old(cond) != 0)) && (cond != 0);
    ensures ((\old(cond) != 0)) && (1);
@*/
void __VERIFIER_assert(int cond) {
    if (!(cond)) {
    ERROR:
	{/*@ assert(0); */;}
    }
    return;
}

int counter = 0;
/*@ 
    requires ((counter == 0));
    ensures ((\old(counter) == 0));
@*/
int main() {
    int x, y;
    long long q, r, a, b;

    x = __VERIFIER_nondet_int();
    y = __VERIFIER_nondet_int();

    assume_abort_if_not(y >= 1);

    q = 0;
    r = x;
    a = 0;
    b = 0;

/*@
loop invariant (((((((((__int128) q * y) + r) + ((__int128) a * y)) == ((__int128) b + x)) && (\old(counter) == 0)) && (1 <= y)) && (b == ((__int128) a * y))));
@*/
    while (counter++<5) {
	__VERIFIER_assert(b == y*a);
	__VERIFIER_assert(x == q*y + r);
    
	if (!(r >= y))
	    break;
	a = 1;
	b = y;

/*@
loop invariant ((((((1 <= r) && (((((__int128) q * y) + r) + ((__int128) a * y)) == ((__int128) b + x))) && (\old(counter) == 0)) && (1 <= y)) && (b == ((__int128) a * y))));
@*/
	while (counter++<5) {            
	    __VERIFIER_assert(b == y*a);
	    __VERIFIER_assert(x == q*y + r);
	    __VERIFIER_assert(r >= 0);

	    if (!(r >= 2 * b))
		break;
	    
	    __VERIFIER_assert(r >= 2 * y * a);
	    
	    a = 2 * a;
	    b = 2 * b;
	}
	r = r - b;
	q = q + a;
    }
    
    __VERIFIER_assert(x == q*y + r);
    return 0;
}