int n , P; int i2; structcomp { int a , b; comp( int a , int b ) : a(a) , b(b) {} }; comp operator *( comp a , comp b ) { returncomp( ( 1ll * a.a * b.a % P + 1ll * a.b * b.b % P * i2 % P ) % P , ( 1ll * a.a * b.b % P + 1ll * a.b * b.a % P ) % P ); } comp Pow( comp a , int x ){ comp ans( 1 , 0 ); while( x ) { if( x & 1 ) ans = ans * a; a = a * a , x >>= 1; } return ans; } intwork( ){ if( n == 0 ) return0; if( P == 2 && n == 1 ) return1; if( n >= P || Pow( comp(n , 0) , (P - 1) / 2 ).a == P - 1 ) return-1; int t; for( t = rand() % P + 1 ; ; t = rand() % P + 1 ) { i2 = ( 1ll * t * t % P - n + P) % P; if( Pow( comp( i2 , 0 ) , ( P - 1 ) / 2 ).a != P - 1 ) continue; break; } comp ans = Pow( comp( t , 1 ) , ( P + 1 ) / 2 ); returnmin( ans.a , P - ans.a ); }
intmain(){ srand( time( 0 ) ); int T;cin >> T; while( T-- ) { scanf("%d%d",&n,&P); int ans = work( ); if( ans > 0 ) printf("%d %d\n",ans , P - ans); elseif( ans == 0 ) puts( "0" ); elseputs("Hola!"); } }