四平方和(暴力破解)
四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多 444 个正整数的平方和。如果把 000 包括进去,就正好可以表示为 444 个数的平方和。
比如:
5=02+02+12+22\displaystyle 5 = 0^2 + 0^2 + 1^2 + 2^25=02+02+12+22
7=12+12+12+22\displaystyle 7 = 1^2 + 1^2 + 1^2 + 2^27=12+12+12+22
则对于一个给定的正整数 nnn,可以表示为:n=a2+b2+c2+d2n = a^2 + b^2 + c^2 + d^2n=a2+b2+c2+d2。
你需要求出字典序最小的一组解 a,b,c,da,b,c,da,b,c,d。
字典序大小:从左到右依次比较,如果相同则比较下一项,直到有一项不同,较小的一方字典序更小,反之字典序更大,所有项均相同则二者字典序相同。
输入格式
程序输入为一个正整数 N(1≤N≤5000000)N(1 \leq N \leq 5000000)N(1≤N≤5000000)。
输出格式
输出 444 个非负整数 a,b,c,da,b,c,da,b,c,d,中间用空格分开。
样例输入1
5
样例输出1
0 0 1 2
样例输入2
12
样例输出2
0 2 2 2
package 计蒜客; import java.util.Scanner; public class 四平方和 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan=new Scanner(System.in); int n=scan.nextInt(); outer:for(int a=0;a<=Math.sqrt(n);a++){ for(int b=0;b<=Math.sqrt(n-b*b);b++){ if(a*a+b*b>n){break;} for(int c=0;c<=Math.sqrt(n-a*a-b*b);c++){ int d=(int) Math.sqrt(n-a*a-b*b-c*c); if(a*a+b*b+c*c+d*d==n){ System.out.println(a+" "+b+" "+c+" "+d); break outer; } // if(a*a+b*b+c*c>n){ // break; // } // for(int d=0;d<=Math.sqrt(n-a*a-b*b-c*c);d++){ // if(a*a+b*b+c*c+d*d>n){ // break; // } // if(a*a+b*b+c*c+d*d==n){ // System.out.println(a+" "+b+" "+c+" "+d); // break outer; // } // } } } } } }