C ++ suma de cuatro cuadrados (búsqueda binaria) abre el método de escritura abierto a la izquierda y derecha debe registrar la respuesta.

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;
            }
        }
    }
}

 

Supongo que te gusta

Origin blog.csdn.net/qq_44643644/article/details/108814705
Recomendado
Clasificación