2016年第七届蓝桥杯 省赛 C/C++大学A组 H. 四平方和 题解 枚举

该篇文章讨论了如何利用四平方和定理找到一个正整数n的最小字典序表示为四个非负整数的平方和。通过枚举并计算第四个数d,检查其是否为整数,找到符合条件的解。给出的C++代码展示了这个过程。
摘要由CSDN通过智能技术生成

四平方和

题目描述

四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多四个正整数的平方和。如果把 0 包括进去,就正好可以表示为四个数的平方和。即对于一个给定的正整数 n,可以表示为:n = a2 + b2 + c2 + d2
你需要求出 字典序 最小的一组解 a,b,c,d。字典序大小:从左到右依次比较,如果相同则比较下一项,直到有一项不同,较小的一方字典序更小,反之字典序更大,所有项均相同则二者字典序相同。

输入描述

输入为一个正整数 N。

输出描述

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

用例输入 1

5

用例输出 1

0 0 1 2

用例输入 2

12

用例输出 2

0 2 2 2

数据规模与约定

1 ≤ N ≤ 5000000 1≤N≤5000000 1N5000000

思路

枚举前三个数 a , b , c a,b,c a,b,c,然后通过 d 2 = n − a 2 − b 2 − c 2 d^2=n-a^2-b^2-c^2 d2=na2b2c2 计算出 d 2 d^2 d2 的值,最后通过对其开方确定 d d d 是否为整数。若为整数,则说明此时 a , b , c , d a,b,c,d a,b,c,d 是一组解。

题目链接

AcWing——传送门

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin >> n;
    int temp;
    // 字典序从小到大枚举a,b,c.
    for (int i = 0; i * i < n; i++)
        for (int j = i; j * j < n; j++)
            for (int k = j; k * k < n; k++)
            {
                // 优化:d不必再枚举,可以通过计算得到d的值,如果计算得到的temp开方后是整数,就说明d存在,否则不存在。
                temp = n - i * i - j * j - k * k;
                if ((int)pow((int)pow(temp, 0.5), 2) == temp) // 判断temp开方后是否为整数
                {
                    cout << i << ' ' << j << ' ' << k << ' ' << (int)(pow(temp, 0.5)) << "\n"; // 如果是,则返回答案,并终止程序
                    return 0;
                }
            }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值