Title

P9783 [ROIR 2020 Day1] 平方 题解

题目大意

给你一个整数 n,问你能否找到两个正整数 xy 使得 x2y2=n

解题思路

首先,我们把以上式子分解一下,得到 (xy)×(x+y)=n,令 c1×c2=n,得 {x+y=c1xy=c2{x=c1+c22y=c1c22(c1>c2),那么,该式子有解当且仅当 (c1+c2)mod2=0(c1c2)mod2=0。易得,c1c2 奇偶性相同,即 c1c2 同奇同偶。分以下两种情况讨论:

  1. n 为奇数时,此时若 n>1 ,恒有解,其中一组关于 c1c2 的解为 {c1=1c2=n
  2. n 为偶数时,当且仅当 nmod4=0n>4 时有解,其中一组关于 c1c2 的解为 {c1=2c2=n2

综上所述,按照以上两种情况讨论即可,输出时分别输出 max(c1+c22,c1c22)min(c1+c22,c1c22) 即可。

AC 代码

#include<math.h>
#include<stdio.h>
#define ll long long
#include<algorithm>
using namespace std;
ll n,c1,c2;
bool is=true;
int main(){
    scanf("%lld",&n);
    if(n==0){
        printf("Yes\n1 1");
        return 0;
    }
    if(n==1||n==4){
        printf("No");
        return 0;
    }
    if(n&1){
        puts("Yes");
        c1=1,c2=n;
    }else{
        if(n%4!=0) 
            puts("No"),
            is=false;
        else{
            puts("Yes");
            c1=2,c2=n/2;
        }
    }if(is)
        printf("%lld %lld",max((c1+c2)/2,abs(c1-c2)/2),min((c1+c2)/2,abs(c1-c2)/2));
}
posted @   UncleSam_Died  阅读(9)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示