Problem:
Problem A: Ginkgo Numbers

We will define Ginkgo numbers and multiplication on Ginkgo numbers.

A Ginkgo number is a pair <m, n> where m and n are integers. For example, <1, 1>, <-2, 1> and <-3,-1> are Ginkgo numbers.

The multiplication on Ginkgo numbers is defined by <m, n> · <x, y> = <mx − ny, my + nx>. For example, <1, 1> · <-2, 1> = <-3,-1>.

A Ginkgo number <m, n> is called a divisor of a Ginkgo number <p, q> if there exists a Ginkgo number <x, y> such that <m, n> · <x, y> = <p, q>.

For any Ginkgo number <m, n>, Ginkgo numbers <1, 0>, <0, 1>, <-1, 0>, <0,-1>, <m, n>, <-n,m>, <-m,-n> and <n,-m> are divisors of <m, n>. If m2+n2 > 1, these Ginkgo numbers are distinct. In other words, any Ginkgo number such that m2 + n2 > 1 has at least eight divisors.

A Ginkgo number <m, n> is called a prime if m2+n2 > 1 and it has exactly eight divisors. Your mission is to check whether a given Ginkgo number is a prime or not.

The following two facts might be useful to check whether a Ginkgo number is a divisor of another Ginkgo number.

Suppose m2 + n2 > 0. Then, <m, n> is a divisor of <p, q> if and only if the integer m2 + n2 is a common divisor of mp + nq and mq − np.

If <m, n> · <x, y> = <p, q>, then (m2 + n2)(x2 + y2) = p2 + q2.

Input

The first line of the input contains a single integer, which is the number of datasets.

The rest of the input is a sequence of datasets. Each dataset is a line containing two integers m and n, separated by a space. They designate the Ginkgo number <m, n>. You can assume 1 < m2 + n2 < 20000.

Output

For each dataset, output a character 'P' in a line if the Ginkgo number is a prime. Output a character 'C' in a line otherwise.

Sample Input

8
10 0
0 2
-3 0
4 2
0 -13
-4 1
-2 -1
3 -1

Output for the Sample Input

C
C
P
C
C
P
P
C

Solution in JAVA (judge verdict: Accepted)

import java.util.Scanner;
public class Main
{
	public static void main(String[] args) 
	{
		Scanner in=new Scanner(System.in);
		int N=in.nextInt();
		while(N-->0)
		{
			int m=in.nextInt();
			int n=in.nextInt();
			Ginko gi=new Ginko(m, n);
			
			boolean flg=true;
			for(int i=0;i<150;i++)
			{
				for(int j=0;j<150;j++)
				{
					if(i*i+j*j>gi.m*gi.m+gi.n*gi.n || i*i+j*j==0)
						continue;
					
					if(check(i, j, gi)||check(i, -j, gi)||check(-i, j, gi)||check(-i, -j, gi))
					{
						flg=false;
						break;
					}
				}
				if(!flg)
					break;
			}
			System.out.println(flg ? "P":"C");
		}
	}
	static boolean check(int m, int n, Ginko in)
	{
		if(m==1&&n==0||
			m==0&&n==1||
			m==-1&&n==0||
			m==0&&n==-1||
			m==in.m&&n==in.n||
			m==-in.n&&n==in.m||
			m==-in.m&&n==-in.n||
			m==in.n&&n==-in.m)
			return false;
		int a=m*in.m+n*in.n;
		int b=m*in.n-n*in.m;
		int mn=m*m+n*n;
		
		if(a%mn==0&&b%mn==0)
			return true;
		else
			return false;
	}
}

class Ginko
{
	int m;
	int n;
	Ginko(int m, int n)
	{
		this.m=m;
		this.n=n;
	}
}