1 条题解

  • 0
    @ 2025-8-24 22:51:48

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar cff_0102
    & aqua_qaq | 团子群 185800038 | 如果我死了说明我 AFO 了

    搬运于2025-08-24 22:51:48,当前版本为作者最后更新于2023-10-23 16:22:00,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    因为 x2y2=nx^2-y^2=n,所以 (x+y)(xy)=n(x+y)(x-y)=nx+yx+yxyx-y 明显同号,所以 nn 要么得是奇数,要么能被 44 整除,否则它就不能被分成 (x+y)(xy)(x+y)(x-y)

    nn 是奇数,考虑构造 x+y=n,xy=1x+y=n,x-y=1。两式相加,得到 2x=n+12x=n+1,两式相减,得到 2y=n12y=n-1。所以当 nn 是奇数,其中一个答案就是 x=n+12,y=n12x=\frac{n+1}{2},y=\frac{n-1}{2}。但是,题面又规定 x,yx,y 必须是正整数,所以 nn11 时无解,需要特判。

    nn 能被 44 整除,先抛开 n=0n=0 的情况,考虑构造 x+y=n2,xy=2x+y=\frac{n}{2},x-y=2。同样的方法,计算出 $x=\frac{\frac{n}{2}+2}{2}=\frac{n}{4}+1,y=\frac{\frac{n}{2}-2}{2}=\frac{n}{4}-1$。因为 x,yx,y 得是正整数,所以 n=4n=4 时无解。而当 n=0n=0 时,只需要 x=yx=y 即可,所以此时输出两个相等的数就行了。

    综上,可以先判断 nn 是否为 00,为 00 时输出两个相同的数;然后判断 nn 是否是 1144,如果是则无解;接下来判断 nn 是否是不能被 44 整除的偶数,是则无解;最后判断 nn 是奇数还是偶数,然后输出相应的 x,yx,y 的解。

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
    	ios::sync_with_stdio(false);
    	long long n;cin>>n;
    	if(n==0)cout<<"Yes\n114514 114514",exit(0);//n 为 0 的情况
    	if(n==1||n==4)cout<<"No",exit(0);//n 为 1 或 4 的特殊情况
    	if(n%4==2)cout<<"No",exit(0);//n 不是奇数也不是 4 的倍数的情况
    	if(n%2)cout<<"Yes\n"<<(n+1)/2<<" "<<(n-1)/2;//n 是奇数的情况
    	else cout<<"Yes\n"<<n/4+1<<" "<<n/4-1;//n 是 4 的倍数的情况
    	return 0;
    }
    
    • 1

    信息

    ID
    9347
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者