From the mathematical principle:
A number N is expressed as a sum of 2 squares if and only if in a prime factorization of N every prime number (4k+3) occurs an even number of times!
What I did pre-calculates all 4k+3 numbers and checks its frequency by continuous division.
This program is written in accordance with the restrictions:
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) {
But this does not work on the SPOJ website.
Am I missing something? Or am I doing something wrong?
0 also considered in this.
Some valid cases are: 1 = 1^2 + 0^2 8 = 2^2 + 2^2
source share