35.四方定理

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。icon-default.png?t=N7T8https://www.iai.sh.cn/problem/477

题目背景

四方定理是数论中著名的一个定理,指任意一个自然数都可以拆成四个自然数的平方之和。例如:

题目描述

给定一个自然数 𝑛,请输出 𝑛 的所有四平方拆分方案。

输入格式

单个整数:表示 𝑛。

输出格式

若干行:每行四个由小到大排列的自然数,表示一种拆分方案。如果有多种方案,先输出首项较小的方案,对于首项相同的方案,先输出第二项较小的方案,其他情况以此类推。

数据范围

0≤𝑛≤50,000。

>>>>>>分割线>>>>>>>>>>>>>分割线>>>>>>>>>>>>>分割线>>>>>>>>>>>>>分割线>>>>>>>

思路

1.常规思路:四层嵌套循环,按最大值预估,会执行200*200*200*200=16亿多次,超时。

2.找出规律:a²+b²+c²+d²=n

  • 假设a=b=c=d,则a=sqrt(n/4), 范围缩小

  • 假设a=0,b=c=d,则b=sqrt(n/3), 范围进一步缩小

  • 假设a=b=0,c=d,则c=sqrt(n/2), 范围再进一步缩小

  • 假设a=b==c=0,则d=sqrt(n), 范围缩小

程序

#include <bits/stdc++.h>
using namespace std;
int n;
int main()
{
	cin>>n;
	for(int l=0;l<=sqrt(n/4);l++)
	for(int k=l;k<=sqrt(n/3);k++)
	for(int j=k;j<=sqrt(n/2);j++)
	for(int i=j;i<=sqrt(n);i++)	
	if(n==i*i+j*j+k*k+l*l)
	cout<<l<<" "<<k<<" "<<j<<" "<<i<<endl;

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子龙烜

坦克大战系列,手把手带你实现

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值