1 条题解

  • 0
    @ 2025-8-24 22:40:56

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 封禁用户
    None

    搬运于2025-08-24 22:40:56,当前版本为作者最后更新于2023-04-20 22:31:11,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    分析

    【主体思路】

    对于每个 nn,我们可以去枚举 a,b,ca,b,c 的值,因为在 n=a2+b2+c2+d2n=a^2+b^2+c^2+d^2 时,dd 一定是等于 na2b2c2\sqrt {n-a^2-b^2-c^2} 的。而 a,b,c,da,b,c,d 又都是整数,所以我们只需要看 dd 的值是不是整数就行啦。

    【边界判断】

    因为题目保证 abcda \le b \le c \le d,所以在枚举 aa 时,若 a2+a2+a2+a2>na^2+a^2+a^2+a^2>n,则一定无法再有可能情况了,b,cb,c 同理。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    int n;
    int check(int a,int b,int c,int d){return a*a+b*b+c*c+d*d;}
    //求a^2+b^2+c^2+d^2
    int main()
    {
    	cin>>n;
    	for(int i=0;;i++)
    	{
    		if(check(i,i,i,i)>n) break;//边界判断
    		for(int j=i;;j++)
    		{
    			if(check(i,j,j,j)>n) break;
    			for(int k=j;;k++)
    			{
    				if(check(i,j,k,k)>n) break;
    				else
    				{
    					int s=sqrt(n-check(i,j,k,0));
    					if(check(i,j,k,s)==n) return cout<<i<<" "<<j<<" "<<k<<" "<<s,0; 
    				}
    			}
    		}
    	}
    }
    
    • 1

    信息

    ID
    5948
    时间
    3000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者