上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://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;
}