首页 > 编程语言 >四平方和【第七届蓝桥杯省赛C++A/B组,第七届蓝桥杯省赛JAVAB/C组】

四平方和【第七届蓝桥杯省赛C++A/B组,第七届蓝桥杯省赛JAVAB/C组】

时间:2022-12-16 11:26:14浏览次数:85  
标签:return temp int mid 平方和 蓝桥 省赛 include 第七届

四平方和

四平方和定理,又称为拉格朗日定理:

每个正整数都可以表示为至多 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 为联合主键升序排列,最后输出第一个表示法。

输入格式
输入一个正整数 N。

输出格式
输出4个非负整数,按从小到大排序,中间用空格分开。

数据范围
\(0<N<5∗106\)
输入样例:
5
输出样例
0 0 1 2

思路

  1. 暴力
  2. 二分(见二分模板题

Code

1.暴力(11/12 TLE)

点击查看代码
#include<iostream>
#include<cmath>
using namespace std;
int n;

int main(){
	cin >> n;
	for(int a = 0; a * a <= n; a ++){
		for(int b = a; a * a + b * b<= n; b ++){
			for(int c = b;a * a + b * b + c * c<= n; c ++){
				int t = n - a * a - b * b - c * c;
				int d = sqrt(t);
				//cout << t << "  " << d << endl;
				if(d*d == t && d >= c){
					printf("%d %d %d %d",a,b,c,d);
					return 0;
				}
			}
		}
	}
} 

2. 二分

点击查看代码
#include<iostream>
#include<cstdio>
#include<cmath> 
#include<algorithm>
#define endl '\n'
using namespace std;

const int N = sqrt(5*1e6) + 10;
typedef struct temp{
	int c,d,s;
}temp;
int n;
temp t[N * N];

bool cmp(temp a,temp b){
	if(a.s != b.s)return a.s < b.s;	//二分前的预处理为有序
	else if(a.c != b.c)return a.c < b.c;//维护答案要求的顺序
	else return a.d < b.d;
}
bool check(int mid,int x){
	int c = t[mid].c,d = t[mid].d;
	if(c*c + d*d >= x)return 1;
	else return 0;
}
int main(){
//	ios::sync_with_stdio(false);
//	cin.tie(0),cout.tie(0);
	cin >> n;
	int cnt = 0;
	for(int c = 0; c * c <= n; c ++ ){		//预处理
		for(int d = c; c * c + d * d <= n; d ++){
			t[cnt ++] = {c,d,c * c + d * d};
		} 
	}
	
	sort(t,t + cnt,cmp);
	//for(int i = 0; i < cnt; i ++)printf("%d %d %d\n",t[i].c,t[i].d,t[i].s); 
	for(int a = 0; a * a <= n; a ++ ){	//优化为两层for循环+二分
		for(int b = a; a * a + b * b <= n; b ++ ){
			int x = n - a * a - b * b;	//搜索值
			int l = 0, r = cnt - 1;	//搜索范围
			while(l < r){
				int mid = l + r >> 1;
				if(check(mid,x))r = mid;
				else l = mid + 1;
			}
			int c = t[l].c,d = t[l].d;	//注意这里是l或者r而不是mid 
			if(x == c*c + d*d && b <= c){	//维护答案要求的顺序
				printf("%d %d %d %d",a,b,c,d);	//按格式输出
				return 0;
			}
		}
	}
	return 0;
} 

标签:return,temp,int,mid,平方和,蓝桥,省赛,include,第七届
From: https://www.cnblogs.com/J-12045/p/16986839.html

相关文章

  • 蓝桥杯练习(寻找字符串)
    题目:注意事项:1、为什么输入需要使用fgets()函数?因为题目样例中出现了含有空格的字符串,而scanf()getchar()不具有接受空格字符串的能力,而gets()不安全,所以使用fgets()fgets()......
  • 蓝桥杯之单片机学习(一)——LED指示灯的基本控制
    文章目录​​一、前言​​​​课程内容结构​​​​二、训练任务​​​​三、训练重点​​​​四、74HC138​​​​五、74HC573​​​​六、代码展示​​一、前言课程内容结......
  • 蓝桥杯之单片机学习(三)——共阳数码管的静态显示
    文章目录​​一、训练任务​​​​二、训练重点​​​​三、训练准备​​​​3.1原理图展示​​​​3.2数字对照表​​​​3.3数码管分路​​​​3.4一些解释​​​​四......
  • 今日份蓝桥杯训练
    题目:解答:#define_CRT_SECURE_NO_WARNINGS1#include<iostream>#include<string>usingnamespacestd;intmain(){charc;//将数字和字符都考虑进去cin>>c;if(c>=......
  • 洛谷P8767 [蓝桥杯 2021 国 A] 冰山 题解 splay tree
    题目链接:​​https://www.luogu.com.cn/problem/P8767​​鸣谢:这道题的顺利解决得到了​​7KByte​​大佬的大力帮助,在此再次表示感谢。首先,我的想法是这样的:使用一个spl......
  • 蓝桥杯校赛题目以及解析
    题目一输入一个字符串,求它包含多少个单词。单词间以一个或者多个空格分开。第一个单词前,最后一个单词后也可能有0到多个空格。比如:"abc   xyz"包含两个单词,"ab  c......
  • arm蓝桥编译与反编译——20201302姬正坤
    程序的编译反编译汇编程序的运行遇到错误无法实现,目前还在调试......
  • 第七届黑客松的参赛收获
    收获:(1) 学会了使用pip的参数解决包的安装问题,当用pip安装包因为网络问题导致安装失败时可用pip中的参数--default-timeout设置安装时间,也可以用-i参数设置镜像源,选择适......
  • P8742 [蓝桥杯 2021 省 AB] 砝码称重 题解
    题目分析原题链接P8742[蓝桥杯2021省AB]砝码称重由这道题,我们不难联想到P2347砝码称重,两题的做法是相似的。因此这道题做法就是背包。其本质上都是选取砝码,求能......
  • 蓝桥杯 ALGO-50算法训练 数组查找及替换
    问题描述给定某整数数组和某一整数b。要求删除数组中可以被b整除的所有元素,同时将该数组各元素按从小到大排序。如果数组元素数值在A到Z的ASCII之间,替换为对应字母。......