El teorema de la suma de cuatro cuadrados, también conocido como teorema de Lagrange:
Cada entero positivo se puede expresar como la suma de los cuadrados de 4 enteros positivos como máximo.
Si se incluye 0, se puede expresar como la suma de los cuadrados de 4 números.
como:
5 = 0 ^ 2 + 0 ^ 2 + 1 ^ 2 + 2 ^ 2
7 = 1 ^ 2 + 1 ^ 2 + 1 ^ 2 + 2 ^ 2
Para un entero positivo dado, puede haber múltiples representaciones de la suma de cuadrados.
Debes ordenar los 4 números:
0≤a≤b≤c≤d
Y presione a, b, c, d para todas las representaciones posibles
Ordene la clave primaria conjunta en orden ascendente y envíe la primera notación al final.
Formato de entrada
Ingrese un número entero positivo N.
Formato de salida
Salida 4 números enteros no negativos, ordenados de menor a mayor, separados por espacios.
rango de datos
0 <N <5 ∗ 10 ^ 6
Muestra de entrada:
5
Salida de muestra:
0 0 1 2
#include<stdio.h>
#include<algorithm>
using namespace std;
struct Node
{
int sum,c,d;
bool operator<(Node &node)//排序规则,书写技巧:越重要,越先判
{
if(sum!=node.sum) return sum<node.sum;
if(c!=node.c) return c<node.c;
return d<node.d;
}
}s[5000010];
int n;
int top=0;
int main()
{
scanf("%d",&n);
for(int c=0;c*c<n;++c)
{
for(int d=c;c*c+d*d<=n;++d)
{
s[top++]={c*c+d*d,c,d};
}
}
sort(s,s+top);
for(int i=0;i<top;++i)
{
printf("%d:%d %d %d\n",i,s[i].sum,s[i].c,s[i].d);
}
for(int a=0;a*a<n;++a)
{
for(int b=a;a*a+b*b<n;++b)
{
int t=n-(a*a+b*b);
int l,r,mid;
l=-1;r=top;
int ans;
while(l+1!=r)//左开右开写法必须及时记录更新答案
{
mid=l+((r-l)>>1);
if(s[mid].sum>=t)
{
r=mid;
ans=mid;
}
else l=mid;
}
if(s[ans].sum==t)
{
printf("%d %d %d %d",a,b,s[ans].c,s[ans].d);
return 0;
}
}
}
}