四平方和书

给定一个小于5000000的数,将之分解为至多4个数的平方和。

#include<bits/stdc++.h>
#define maxn 5000005
using namespace std;
bool a2b2[maxn];
int main()
{
    memset(a2b2,0,sizeof(a2b2));
    for(int i=0;i*i<maxn;i++)
    {
        for(int j=0;j*j<maxn;j++)
        {
            int tmp=i*i+j*j;
            if(tmp<maxn)
            {
                a2b2[tmp]=true;
            }
        }
    }
    int n;
    cin>>n;
    for(int i=0;i*i<=n;i++)
    {
        for(int j=0;j*j<=n;j++)
        {
            int tmp=i*i+j*j;
            if (tmp>n) continue;
            if(!a2b2[n-tmp]) continue;

            int res=n-tmp;
            for(int k=0;k*k<=res;k++)
            {
                int l=res-k*k;
                if(l-(int)sqrt(l)*(int)sqrt(l)==0)
                {
                    l=(int)sqrt(l);
                    int ans[4]={i,j,k,l};
                    sort(ans,ans+4);
                    for(int t=0;t<3;t++)
                        cout<<ans[t]<<" ";
                    cout<<ans[3]<<endl;
                    return 0;
                }
            }
        }
    }
    return 0;
}

这里有一个拉格朗日定理:每个正整数都可以表示为至多

4 个正整数的平方和。如果把 00 包括进去,就正好可以表示为 44 个数的平方和。

四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多 44 个正整数的平方和。如果把 00 包括进去,就正好可以表示为 44 个数的平方和。

比如:

\displaystyle 5 = 0^2 + 0^2 + 1^2 + 2^25=0?2??+0?2??+1?2??+2?2??

\displaystyle 7 = 1^2 + 1^2 + 1^2 + 2^27=1?2??+1?2??+1?2??+2?2??

则对于一个给定的正整数 nn,可以表示为:n = a^2 + b^2 + c^2 + d^2n=a?2??+b?2??+c?2??+d?2??。

你需要求出字典序最小的一组解 a,b,c,da,b,c,d。

字典序大小:从左到右依次比较,如果相同则比较下一项,直到有一项不同,较小的一方字典序更小,反之字典序更大,所有项均相同则二者字典序相同。

输入格式

程序输入为一个正整数 N(1 \leq N \leq 5000000)N(1≤N≤5000000)。

输出格式

输出 44 个非负整数 a,b,c,da,b,c,d,中间用空格分开。

样例输入1

5

样例输出1

0 0 1 2

样例输入2

12

样例输出2

0 2 2 2

查看提示

C 语言                            
                                                                                         
                                 C++ 语言 (C++11)                            
                                                                                         
                                 Java 语言

C++ 语言 (C++11)

1

#include<bits/stdc++.h>

2

#define maxn 5000005

3

using namespace std;

4

bool a2b2[maxn];

5

int main()

6

{

7

    memset(a2b2,0,sizeof(a2b2));

8

    for(int i=0;i*i<maxn;i++)

9

    {

10

        for(int j=0;j*j<maxn;j++)

11

        {

12

            int tmp=i*i+j*j;

13

            if(tmp<maxn)

14

            {

15

                a2b2[tmp]=true;

16

            }

17

        }

18

    }

19

    int n;

20

    cin>>n;

21

    for(int i=0;i*i<=n;i++)

重做历史

时间: 2024-12-18 02:13:00

四平方和书的相关文章

2016蓝桥杯省赛C/C++A组第八题 四平方和

题意: 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1^2 + 2^2 7 = 1^2 + 1^2 + 1^2 + 2^2 (^符号表示乘方的意思) 对于一个给定的正整数,可能存在多种平方和的表示法. 要求你对4个数排序: 0 <= a <= b <= c <= d 并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法 程序

8.四平方和

四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和.如果把0包括进去,就正好可以表示为4个数的平方和. 比如:5 = 0^2 + 0^2 + 1^2 + 2^27 = 1^2 + 1^2 + 1^2 + 2^2(^符号表示乘方的意思) 对于一个给定的正整数,可能存在多种平方和的表示法.要求你对4个数排序:0 <= a <= b <= c <= d并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法 程序输入为一个正整数N (N

蓝桥杯 四平方和

四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1^2 + 2^2 7 = 1^2 + 1^2 + 1^2 + 2^2 (^符号表示乘方的意思) 对于一个给定的正整数,可能存在多种平方和的表示法. 要求你对4个数排序: 0 <= a <= b <= c <= d 并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法 程序输入为一

java算法 第七届 蓝桥杯B组(题+答案) 8.四平方和

8.四平方和  (程序设计) 四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和.如果把0包括进去,就正好可以表示为4个数的平方和. 比如:5 = 0^2 + 0^2 + 1^2 + 2^27 = 1^2 + 1^2 + 1^2 + 2^2(^符号表示乘方的意思) 对于一个给定的正整数,可能存在多种平方和的表示法.要求你对4个数排序:0 <= a <= b <= c <= d并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法

四平方和

四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和.如果把0包括进去,就正好可以表示为4个数的平方和. 比如:5 = 0^2 + 0^2 + 1^2 + 2^27 = 1^2 + 1^2 + 1^2 + 2^2(^符号表示乘方的意思) 对于一个给定的正整数,可能存在多种平方和的表示法.要求你对4个数排序:0 <= a <= b <= c <= d并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法 程序输入为一个正整数N (N

2016蓝桥杯C++A组第八题 四平方和

直接暴力的话  四层循环 很可能超时  这里用到了小技巧 #include<stdio.h> #include<iostream> #include<cmath> using namespace std; int a[5000001]; int main(){ int n; cin>>n; int flag=0; for(int i=0;i<=(int)sqrt(n);i++){ for(int j=i;j<=(int)sqrt(n);j++){

学员心声(四)

学员:徐同学 一句话介绍学习感受:庆兴把钱花在刀刃上 学习经历: 1991年生,目前还在杭州重点高等学校读书,2014年本科毕业几乎是混着过来的,也就懂点STM32和51单片机,做个几个简单的电子小设计,但是对于嵌入式,基于操作系统的应用并没有太多了解.虽然一直想学习,毕竟这是个软件当道的世界,硬件方面的工作确实不太好找(主要还是水平不行,公司要求颇高). 15年5月无意间看到了韦东山老师的视频,在此之前看过**的视频,大都是对着LDD第三版的概念泛泛而谈,听过看过之后就忘了,总感觉用不起来.然

复旦大学《高等代数学习指导书(第三版)》前言

本书的第二版自 2007 年出版以来, 得到了广大读者的关心与肯定. 在 8 年来的教学实践过程中, 我们陆续收到了兄弟院校的同行专家以及学生们的各种意见和建议. 另外, 普通高等教育“十二五”国家级规划教材<高等代数学 (第三版)>(复旦大学出版社) 已于 2014 年 10 月正式出版, 因此作为该教材配套的学习方法指导书, 本书第三版的修订工作也提上了议事日程. 本书的第三版保持了第二版原有的框架和体系, 但在以下几个方面做了进一步的修改和完善. 首先, 更正了第二版中出现的错误和不当之

视觉slam学习之路(一)看高翔十四讲所遇到的问题

目前实验室做机器人,主要分三个方向,定位导航,建图,图像识别,之前做的也是做了下Qt上位机,后面又弄红外识别,因为这学期上课也没怎么花时间在项目,然后导师让我们确定一个方向来,便于以后发论文什么.上个礼拜看了些论文,感觉视觉slam方向还可以,图像识别毕竟不是计算机科班,可能真正要弄也很难有成果,slam也是最近才研究起来,也挺适合我们搞,需要一些高数.c++.ros等知识,学的东西也挺多的,但这样才能体现研究生的价值,不然本科生也能做,然后确定了这个研究方向,希望好好研究个一两年有所成就,研三