c++求指导;【】‘’

谁能解一下
02:CSP-J2022-2解密
查看提交统计提问
总时间限制: 20000ms 单个测试点时间限制: 1000ms 内存限制: 262144kB
描述
给定一个正整数 k,有 k 次询问,每次给定三个正整数 ni, ei, di,求两个正整数 pi, qi,使 ni = pi × qi, ei × di = (pi − 1)(qi − 1) + 1。

输入
第一行一个正整数 k,表示有 k 次询问。
接下来 k 行,第 i 行三个正整数 ni, di, ei。
输出
输出 k 行,每行两个正整数 pi, qi 表示答案。
为使输出统一,你应当保证 pi ≤ qi。
如果无解,请输出 NO。
样例输入
10
770 77 5
633 1 211
545 1 499
683 3 227
858 3 257
723 37 13
572 26 11
867 17 17
829 3 263
528 4 109
样例输出
2 385
NO
NO
NO
11 78
3 241
2 286
NO
NO
6 88
我的代码:

#include<bits/stdc++.h>
using namespace std;
int k;
int main()
{
    
    cin>>k;
    for(int i=1;i<=k;i++)
    {
        long long n,d,e;
        cin>>n>>d>>e; 
        long long s=n-d*e+2;
        long long r=(n-d*e+2)/2,l=1;
        while(l<r)
        {
            int mid=(l+r)/2;
            if(mid*(s-mid)>=n)
            {
                r=mid;
            }
            else
            {
                l=mid+1;
            }
        }
        if(l*(s-l)==n)
        {
            cout<<l<<(l-1) ;
        }
        else
        {
            cout<<"no";
        }
        
    }
    
    return 0;
}

结果为wrong answer;


#include<bits/stdc++.h>
using namespace std;
int k;
int main()
{
    
    cin>>k;
    for(int i=1;i<=k;i++)
    {
        long long n,d,e;
        cin>>n>>d>>e; 
        long long s=n-d*e+2;
        long long r=(n-d*e+2)/2,l=1;
        while(l<r)
        {
            int mid=(l+r)/2;
            if(mid*(s-mid)>=n)
            {
                r=mid;
            }
            else
            {
                l=mid+1;
            }
        }
        if(l*(s-l)==n)
        {
            cout<<l<<(l-1) ;
        }
        else
        {
            cout<<"NO";
        }
        
    }
    
    return 0;
}
 

【以下回答由 GPT 生成】

你的代码输出结果为wrong answer的原因是因为你没有在输出时添加空格或换行符,导致输出的数字连接在一起而无法正确解析。此外,你在输出NO时也没有添加换行符。

除此之外,你还可以优化你的代码。在求解pi和qi时,可以使用一个循环来枚举pi的值,然后计算qi是否能满足条件。这样可以避免使用二分法。

以下是修改后的代码:

#include<iostream>
using namespace std;

int main() {
    int k;
    cin >> k;
    for (int i = 0; i < k; i++) {
        int n, d, e;
        cin >> n >> d >> e;
        int pi = 1, qi = n;
        bool found = false;
        while (pi <= n) {
            if (d * e == (pi - 1) * (qi - 1) + 1) {
                found = true;
                break;
            }
            pi++;
            qi = n / pi;
        }
        if (found) {
            cout << pi << " " << qi << endl;
        } else {
            cout << "NO" << endl;
        }
    }
    return 0;
}

请尝试运行代码并检查是否得到正确的结果。如果还有其他问题,请告诉我。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^