四平方和【第七届蓝桥杯省赛C++A/B组,第七届蓝桥杯省赛JAVAB/C组】
四平方和
四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多 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
思路
- 暴力
- 二分(见二分模板题)
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;
}
四平方和【第七届蓝桥杯省赛C++A/B组,第七届蓝桥杯省赛JAVAB/C组】的更多相关文章
- java算法 第七届 蓝桥杯B组(题+答案) 8.四平方和
8.四平方和 (程序设计) 四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和.如果把0包括进去,就正好可以表示为4个数的平方和. 比如:5 = 0^2 + 0^2 + ...
- 第七届蓝桥杯javaB组真题解析-四平方和(第八题)
题目 /* 四平方和 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1 ...
- java实现第七届蓝桥杯四平方和
四平方和 四平方和 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1^ ...
- 蓝桥杯-四平方和-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
- 蓝桥杯比赛javaB组练习《四平方和》
四平方和 四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和.如果把0包括进去,就正好可以表示为4个数的平方和. 比如:5 = 0^2 + 0^2 + 1^2 + 2^27 ...
- 2016蓝桥杯省赛C/C++A组第八题 四平方和
题意: 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1^2 + 2^ ...
- 2014嘉杰信息杯ACM/ICPC湖南程序设计邀请赛暨第六届湘潭市程序设计竞赛
比赛链接: http://202.197.224.59/OnlineJudge2/index.php/Contest/problems/contest_id/36 题目来源: 2014嘉杰信息杯ACM ...
- 7-Java-C(四平方和)
题目描述: 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1^2 + ...
- 费马平方和定理&&斐波那契恒等式&&欧拉四平方和恒等式&&拉格朗日四平方和定理
费马平方和定理 费马平方和定理的表述是:奇素数能表示为两个平方数之和的充分必要条件是该素数被4除余1. 1. 如果两个整数都能表示为两个平方数之和的形式,则他们的积也能表示为两个平方数之和的形式. $ ...
- 第七届蓝桥杯省赛javaB组 第七题剪邮票
剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是合格的 ...
随机推荐
- Python 嵌入式打包 (图文)
Python嵌入式打包过程 目录 Python嵌入式打包过程 下载嵌入式包 解压和配置 安装pip和其他依赖 启动项目 python嵌入式打包:将python环境与项目代码打包到同一个文件夹中,在其他 ...
- 每日算法3:随机生成五个不同整数,将数字转换为RMB格式
随机生成五个不同整数 点击查看代码 /* 题目解析: 1.采用Math对象的random()方法, 2.将每次生成的数跟之前的数判断相等则此次生成无效i-- */ function randomNum ...
- 题解 P6355 [COCI2007-2008#3] DEJAVU
kcm的原题.. 貌似是个组合数(? \(\sf {Solution}\) 对于每一个点,我们需要统计与它同一行的点数\(a\) 和同一列的点数\(b\) ,则该点对结果\(ans\) 的贡献为\(( ...
- Ruoyi表单构建
Ruoyi表单构建通过拖动组件就能自动生成前端代码,很方便,所以本文简单通过上层函数源码来梳理一下大致流程,如有需要再自行仔细一行行分析底层代码. 组件拖动 实现组件拖动功能主要依赖第三方库:VueD ...
- 三、Ocelot请求聚合与负载均衡
上一篇文章介绍了在.Net Core中如何使用Ocelot:https://www.cnblogs.com/yangleiyu/p/16847439.html 本文介绍在ocelot的请求聚合与负载均 ...
- day10-Tomcat02
Tomcat02 4.IDEA开发JavaWeb工程 4.1开发javaweb工程&配置Tomcat&启动项目 需求:使用idea开发javaweb工程fishWeb,并将网页部署到f ...
- 基于 .NET 7 的 QUIC 实现 Echo 服务
前言 随着今年6月份的 HTTP/3 协议的正式发布,它背后的网络传输协议 QUIC,凭借其高效的传输效率和多路并发的能力,也大概率会取代我们熟悉的使用了几十年的 TCP,成为互联网的下一代标准传输协 ...
- tool1
//导出 public void excel(List<Long> ids, HttpServletResponse response) { List<StockPageVo> ...
- 【题解】CF45I TCMCF+++
题面传送门 题目描述 有 \(n\) 个数 \(a_i\) 请你从中至少选出一个数,使它们的乘积最大 解决思路 对于正数,对答案一定有贡献(正数越乘越大),所以输入正数时直接输出即可. 对于负数,如果 ...
- 基于python的数学建模---蒙特卡洛算法
import math import random m = input('请输入一个较大的整数') n = 0 for i in range(int(m)): x = random.random() ...