注:本文为洛谷用户 zhangsenhao6728(也就是我)的题解,已提交成功。
思路讲解
由于要求 x x x 最小,所以只用考虑 x x x,而 y y y 可以被求出来。
首先考虑 x = 0 x=0 x=0 的情况,带入方程: r = 0 2 + 2 × 0 × y + 0 + 1 r=0^2+2\times0\times y+0+1 r=02+2×0×y+0+1。
这时 r = 1 r=1 r=1,所以 r = 1 r=1 r=1 时, ( x , y ) = ( 0 , n ) (x,y)=(0,n) (x,y)=(0,n) 了,吗?
并不是,因为在这里 y y y 是不固定的,所以也算无解。
然后考虑 x = 1 x=1 x=1,带入方程 r = 1 2 + 2 × 1 × y + 1 + 1 r=1^2+2\times1\times y+1+1 r=12+2×1×y+1+1,这时 y y y 就是固定的了,所以只用考虑 x = 1 x=1 x=1。
然后再来看无解情况,因为 r = 1 2 + 2 × 1 × y + 1 + 1 r=1^2+2\times1\times y+1+1 r=12+2×1×y+1+1,所以 r − 1 2 − 1 − 1 = 2 × 1 × y r-1^2-1-1=2\times1\times y r−12−1−1=2×1×y,这时的 2 × 1 × y 2\times1\times y 2×1×y 必须为偶数,且必须大于等于 2 2 2,最终就是 r r r 必须为奇数,且 r − 1 2 − 1 − 1 ≥ 2 r-1^2-1-1\ge2 r−12−1−1≥2。
AC 代码
#include<bits/stdc++.h>
using namespace std;
int main(){
long long q;
cin>>q;
if(q%2==1&&(q-1*1-1-1)>=2){//化简为 q%2&&q>=5
cout<<"1 "<<(q-1*1-1-1)/1/2;//化简为 cout<<"1 "<<(q-3)/2;
}else{
cout<<"NO";
}
return 0;
}