Description

Since the cubic equation: ax ^ 3 + bx ^ 2 + cx + d = 0 is given, please check the number of positive real roots and the number of negative real roots, respectively.

The number of roots shall be counted including the multiple roots.



Input

The input consists of multiple test cases, and the number is recorded on the first line.

From the second line onward, the coefficients of the cubic equation are written in the form of a b c d. a is not 0, and each number is an integer value from -100 to 100.

Output

For a given cubic equation, output the number of positive real roots and the number of negative real roots separated by a space.

Example

Input

2
1 3 3 1
-10 0 0 0


Output

0 3
0 0

import java.io.*;
import java.util.*;


// 2011/10/21

//@2220 Rûö® 
//  sqrt()ªë·ðÜÞÌªâèÅÍB@@ Ædª0ÌêÍÅÉêª¯µ½Ù¤ªÇ¢
public class Main {

	
	// C return falseÅ¨µÜ¢
	boolean main() throws IOException {

		int[] ir = readIntArray();
		double a = ir[0];
		double b = ir[1];
		double c = ir[2];
		double d = ir[3];

		// 3Âð
//		double g1 = -3;
//		double g2 = -2;
//		double g3 = 0;
//		a = 1;
//		b = -(g1+g2+g3);
//		c = g1*g2 + g2*g3 + g3*g1;
//		d = -(g1*g2*g3);
		
		// ð
//		double g1 = -2;
//		a = 1;
//		b = -(g1);
//		c = 1;
//		d = -(g1);
		
		if (a < 0) {
			a = -a;
			b = -b;
			c = -c;
			d = -d;
		}
		
		// 3ûö®»Ê®
		double D = -4 * c * c * c * a + c*c*b*b - 4 * d*b*b*b + 18 * a*b*c*d - 27 * d*d*a*a;
		// D>0 3Àð
		// D<0 1Àð
		// D==0 dð
		
		// ÷ªQ®
		double a2 = 3 * a;
		double b2 = 2 * b;
		double c2 = c;
		
		// ÷ª2ûö®Ì»Ê®
		double d2 = b2 * b2 - 4 * a2 * c2;
		
		// ÷ª2ûö®Ìð èZr
		double kai1 = (-b2 - Math.sqrt(d2)) / (2 ); // ¬³¢Ù¤
		double kai2 = (-b2 + Math.sqrt(d2)) / (2 );

		
		int kaiCntP = 0; // ³ÌðÌ
		int kaiCntN = 0; // ÌðÌ
		
		if (D > 0) {
			// 3ÂÌÙÈéÀð
			if (d == 0) {
				// 0ððÉÂ
				if (kai1 > 0) {
					kaiCntP = 2;
				}
				else if (kai2 < 0) {
					kaiCntN = 2;
				}
				else {
					kaiCntP = 1;
					kaiCntN = 1;
				}
			}
			else if (d > 0) { // yØÐª³
				if (kai2 < 0) {
					kaiCntN = 3;
				}
				else {
					kaiCntP = 2;
					kaiCntN = 1;
				}
			}
			else {
				if (kai1 > 0) {
					kaiCntP = 3;
				}
				else {
					kaiCntP = 1;
					kaiCntN = 2;
				}
			}
		}
		else if (D < 0) { // êÂÌÀð
			if (d == 0) {
				; // 0 0
			} else if (d > 0) {
				kaiCntN = 1;
			}
			else {
				kaiCntP = 1;
			}
		}
		else { 
			double D2 = -2 * b*b*b + 9*a*b*c - 27*d*a*a;
			if (D2 == 0) { // Odð
				if (d == 0) {
					; // 0 0
				} else if (d > 0) {
					kaiCntN = 3;
				}
				else {
					kaiCntP = 3;
				}
			}
			else { // ñdðÆÊÌÀð
				if (d == 0) {
					if (kai2 < 0) {
						kaiCntN = 2;
					}
					else if (kai1 > 0) {
						kaiCntP = 2;
					}
					else if (kai2 == 0) {
						kaiCntN = 1;
					}
					else {
						assert kai1 == 0;
						kaiCntP = 1;
						
					}
				}
				else if (d > 0) {
					if (kai2 < 0) {
						kaiCntN = 3;
					}
					else {
						kaiCntP = 2;
						kaiCntN = 1;
					}
				}
				else {
					if (kai1 > 0) {
						kaiCntP = 3;
					}
					else {
						kaiCntP = 1;
						kaiCntN = 2;
					}
				}
			}
		}
		
		
		
		
//		if (d2 > 0) {
////			double kai1 = (-b2 - Math.sqrt(d2)) / (2 * a2); // ¬³¢Ù¤
////			double kai2 = (-b2 + Math.sqrt(d2)) / (2 * a2);
////			double y1 = a * kai1 * kai1 * kai1 + b * kai1 * kai1 + c * kai1 + d; 
////			double y2 = a * kai2 * kai2 * kai2 + b * kai2 * kai2 + c * kai2 + d;
//			// èZr
//			//double kai1 = (-b2 - Math.sqrt(d2)) / (2 ); // ¬³¢Ù¤
//			//double kai2 = (-b2 + Math.sqrt(d2)) / (2 );
//			double y1 = a * kai1 * kai1 * kai1 + b * kai1 * kai1 * a2 + c * kai1 * a2 * a2 + d * a2 * a2 * a2; 
//			double y2 = a * kai2 * kai2 * kai2 + b * kai2 * kai2 * a2 + c * kai2 * a2 * a2 + d * a2 * a2 * a2;
//			assert y1 > y2;
//			if (y2 > 0) {
//				if (d > 0) {
//					kaiCntN = 1;
//				}
//				else if (d < 0) {
//					assert false;
//					kaiCntP = 1;
//				}
//				// d=0 Í0 0
//			}
//			else if (y1 < 0) {
//				if (d > 0) {
//					assert false;
//					kaiCntN = 1;
//				}
//				else if (d < 0) {
//					kaiCntP = 1;
//				}
//				// d=0 Í0 0
//			}
//			else if (y2 == 0) {
//				// ñdð
//				if (kai2 == 0) {
//					kaiCntN = 1;
//				}
//				else if (kai2 > 0) {
//					if (d < 0) {
//						kaiCntP = 3;
//					}
//					else if (d > 0) {
//						kaiCntP = 2;
//						kaiCntN = 1;
//					}
//					else {
//						kaiCntP = 2;
//					}
//				}
//				else {
//					kaiCntN = 3;
//				}
//			}
//			else if (y1 == 0) {
//				// ñdð
//				if (kai1 == 0) {
//					kaiCntP = 1;
//				}
//				else if (kai1 < 0) {
//					if (d > 0) {
//						kaiCntN = 3;
//					}
//					else if (d < 0) {
//						kaiCntP = 1;
//						kaiCntN = 2;
//					}
//					else {
//						kaiCntN = 2;
//					}
//				}
//				else {
//					kaiCntP = 3;
//				}
//			}
//			else {
//				// 3ÂÌÙÈéðª éI
//				if (kai1 >= 0) {
//					if (d > 0) {
//						kaiCntP = 2;
//						kaiCntN = 1;
//					}
//					else if (d < 0) {
//						kaiCntP = 3;
//					}
//					else {
//						kaiCntP = 2;
//					}
//				}
//				else if (kai2 <= 0) {
//					if (d > 0) {
//						kaiCntN = 3;
//					}
//					else if (d < 0) {
//						kaiCntP = 1;
//						kaiCntN = 2;
//					}
//					else {
//						kaiCntN = 2;
//					}
//				}
//				else {
//					if (d > 0) {
//						kaiCntP = 2;
//						kaiCntN = 1;
//					}
//					else if (d < 0) {
//						kaiCntP = 1;
//						kaiCntN = 2;
//					}
//					else {
//						kaiCntP = 1;
//						kaiCntN = 1;
//					}
//				}
//			}
//		}
//		else if (d2 == 0) {
////			double kai = -b2 / (2 * a2);
////			double y = a * kai * kai * kai + b * kai * kai + c * kai + d; 
//			double kai = -b2 / (2 ); // a2ÅçÈ¢
//			double y = a * kai * kai * kai + b * kai * kai * a2 + c * kai * a2 * a2 + d * a2 * a2 * a2; 
//			if (y == 0) { // 3d_ªx²ã
//				// 3dð
//				if (kai > 0) {
//					kaiCntP = 3;
//				}
//				else if (kai < 0) {
//					kaiCntN = 3;
//				}
//			}
//			else {
//				if (d > 0) {
//					assert false; // TO DO
//					kaiCntN = 1;
//				}
//				else if (d < 0) {
//					assert false; // TO DO
//					kaiCntP = 1;
//				}
//				// d=0 Í0 0
//			}
//		}
//		else { // d2 < 0
//			if (d > 0) {
//				assert false;
//				kaiCntN = 1;
//			}
//			else if (d < 0) {
//				kaiCntP = 1;
//			}
//			// d=0 Í0 0
//		}
				
		// ðÌ\¦
		System.out.printf("%d %d\n", kaiCntP, kaiCntN);
		
		return true; // ³íI¹ Ö
	}
	

//	private final static boolean DEBUG = true;  // debug
	private final static boolean DEBUG = false; // release

	public static void main(String[] args) throws IOException {

		if (DEBUG) {
			log = System.out;
			
			String inputStr = "1\n-10 0 0 0\n";
			reader = new BufferedReader(new StringReader(inputStr)); 

		}
		else {
			log = new PrintStream(new OutputStream() { public void write(int b) {} } ); // «ÌÄ
			reader = new BufferedReader(new InputStreamReader(System.in)); // R\[©ç
		}
		
		int N = readIntArray()[0];

		for(int i = 0; i < N; i++) {
			boolean b = new Main().main();
			if (!b)
				break;
		}		
		
		reader.close();
	}

	
	static PrintStream log;
	static BufferedReader reader;
	

	// WüÍæè1sªÌXy[XæØèÌ®lðÇÞ
	// EOFÌêÍnullðÔ·
	private static int[] readIntArray() throws IOException {
		
		String s = reader.readLine();
		if (s == null)
			return null;
		String[] sp = s.split(" ");
		int[] a = new int[sp.length];
		for(int i = 0; i < sp.length; i++) {
			a[i] = Integer.parseInt(sp[i]);
		}
		return a;
	}
		
}