第二题解密(二分法)代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll k,n,d,e,m,p,q;
int main()
{
cin >> k;
for (ll i =1;i <=k;i ++)
{
cin >>n >>d >>e;
m =n-e*d+2;
//p+q=m,pxq=n
ll flag =0;
ll l=1,r=m/2;//在此范围内二分枚举
while(l <=r)
{
ll p=(l+r)/2;
ll q=m-p;//算出q,固定周长m
ll mian =p*q;//算出面积
if (mian >n)
{
//让p和q远离
r=p-1;
}
else if (mian <n)
{
//让p和q接近
l=p+1;
}
else
{
//找到p*q正好==n的位置
cout << p <<" "<<q <<endl;
flag =1;
break;
}
}
if (flag ==0)
cout <<"NO"<<endl;
}
return 0;
}
第二题解密(公式推导法)代码:
#include<bits/stdc++.h>
using namespace std;
int main(int argc, const char * argv[])
{
long long k;
scanf("%lld",&k);
while (k--)
{
long long n,e,d;
scanf("%lld%lld%lld",&n,&e,&d);
long long PsubQ = sqrt((n - e * d + 2) * (n - e * d + 2) - (n * 4));
long long PaddQ = n - e * d + 2;
long long P = (PsubQ + PaddQ) / 2;
long long Q = PaddQ - P;
if (P * Q == n && e * d == (P - 1) * (Q - 1) + 1 && P && Q)
{
printf("%lld %lld\n",min(P, Q),max(P, Q));
}
else
{
printf("NO\n");
}
}
return 0;
}
第二题解密(公式推导法)文件提交代码:
#include<bits/stdc++.h>
using namespace std;
int main(int argc, const char * argv[])
{
//打开输入文件,输出文件
freopen("decode.in","r",stdin);
freopen("decode.out","w",stdout);
long long k;
scanf("%lld",&k);
while (k--)
{
long long n,e,d;
scanf("%lld%lld%lld",&n,&e,&d);
long long PsubQ = sqrt((n - e * d + 2) * (n - e * d + 2) - (n * 4));
long long PaddQ = n - e * d + 2;
long long P = (PsubQ + PaddQ) / 2;
long long Q = PaddQ - P;
if (P * Q == n && e * d == (P - 1) * (Q - 1) + 1 && P && Q)
{
printf("%lld %lld\n",min(P, Q),max(P, Q));
}
else
{
printf("NO\n");
}
}
//关闭输入文件输出文件
fclose(stdin);
fclose(stdout);
return 0;
}