http://acm.hust.edu.cn/vjudge/contest/view.action?cid=30506#problem/I
#include<map>
#include<set>
#include<list>
#include<cmath>
#include<ctime>
#include<deque>
#include<stack>
#include<bitset>
#include<cstdio>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iomanip>
#include<numeric>
#include<sstream>
#include<utility>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std ;
long long Gcd( long long a , long long b )
{
return b == 0 ? a : Gcd( b , a % b ) ;
}
int main()
{
long long p , q ;
while( scanf( "%lld%lld" , &p , &q) != EOF )
{
if( !p && !q )
break ;
if( p == q )
{
printf( "2 0\n" ) ;
continue ;
}
else if( p == 0 )
{
printf( "0 2\n" ) ;
continue ;
}
long long gcd = Gcd( p , q ) ;
p /= gcd ;
q /= gcd ;
long long n , m , i ;
for( i = 2 ; i <= 50000 ; ++i )
{
if( i * ( i - 1 ) % q == 0 )
{
n = i * ( i - 1 ) / q ;
m = n * p ;
n = sqrt( m + 0.5 ) ;
if( n * ( n + 1 ) == m && n + 1 >= 2 )
break ;
}
}
if( i > 50000 )
{
printf( "impossible\n" ) ;
}
else
{
printf( "%lld %lld\n" , n + 1 , i - n - 1 ) ;
}
}
return 0;
}