拉格朗日定理(四平方和问题)(暴力法优化)

博客提出输入正整数N,求最小字典序的四个数a、b、c、d,使其平方和等于N的问题。并给出优化方案,将可能的平方和c² + d²存入hash表,把四层枚举拆成两层,使时间复杂度从n⁴降到n²。

问题:
输入一个正整数N,输出一个最小字典序的四个数a,b,c,d使它们的平方和等于N。

优化:减少枚举层数。先将可能的平方和c^2 +d^2 存在hash表里。在求得另两个数的平方和后,检查余数是否是两个数的平方。将四层拆分成两层,可以从n^ 4 降到 n^2

#include <stdio.h>
#include<iostream>
#include<map>
#include<cmath>
using namespace std;
int N;
int main()
{
	int a,b,c,d;
	map<int,int>cache;
	cin>>N;
	for(c=0;c*c<=N/2;c++){
		for(d=0;c*c+d*d<=N;d++){
			cache[c*c+d*d]=c;//记录可能出现的平方和 
		}
	}
	
	for(a=0;a*a<=N/4;a++){
		for(b=0;a*a+b*b<=N/2;b++){
			if(cache.find(N-a*a-b*b)!=cache.end()){//如果找不到 返回cache.end()
				c=cache[N-a*a-b*b];
				d=int(sqrt(N-a*a-b*b-c*c));
				cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;
				return 0;
			}
		}
	}
	
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值