From the math principle:
A number N is expressible as a sum of 2 squares if and only if in the prime factorization of N, every prime of the form
(4k+3)
occurs an even number of times!
What I did is pre-calculated all the 4k+3
numbers and checking it's frequency by continuous division.
This program is written in correspondence to the constraints:
1 < T <100
0 < N < 10 ^ 12
import java.util.Scanner;
public class TwoSquaresOrNot {
static int max = 250000;
static long[] nums = new long[max];
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int i = 0; i < max; ++i)
nums[i] = 4 * i + 3;
while (T-- > 0) {
long n = sc.nextLong();
System.out.println((canWrite(n) ? "Yes" : "No"));
}
}
private static boolean canWrite(long n) {
// TODO Auto-generated method stub
for (int i = 0; i < nums.length; ++i) {//loop through all the numbers
if (nums[i] > n)
return true;
int count = 0;
while (n % nums[i] == 0) {
count++;
n /= nums[i];
}
if (count % 2 != 0)//check for odd frequency
return false;
}
return true;
}
}
But this doesn't seem to work in the SPOJ website.
Am I missing something? Or am I doing something wrong?
0
is also considered in this.
Some valid cases are:
1 = 1^2 + 0^2
8 = 2^2 + 2^2
System.out.print
. It might influence the website. – Bernal0^2 + 3^2 = 9
is valid. – Slowworm