2022 CCF CSP-J2 解密

给定一个正整数 k k k,有 k k k 次询问,每次给定三个正整数 n i n_i ni, e i e_i ei, d i d_i di,求两个正整数 p i , q i p_i,q_i pi,qi,使 n i = p i × q i n_i = p_i × q_i ni=pi×qi e i × d i = ( p i − 1 ) ( q i − 1 ) + 1 e_i × d_i = (p_i − 1)(q_i − 1) + 1 ei×di=(pi1)(qi1)+1

输入格式
第一行一个正整数 k k k,表示有 k k k 次询问。
接下来 k k k行,第 i 行三个正整数 n i , d i , e i n_i, d_i, e_i ni,di,ei
输出格式
输出 k k k 行,每行两个正整数 p i , q i p_i, q_i pi,qi 表示答案。
为使输出统一,你应当保证 p i ≤ q i p_i ≤ q_i piqi

如果无解,请输出 NO

数据范围
以下记 m = n − e × d + 2 m = n − e × d + 2 m=ne×d+2
保证对于 100 % 100\% 100% 的数据, 1 ≤ k ≤ 1 0 5 1 ≤ k ≤ 10^5 1k105,对于任意的 1 ≤ i ≤ k 1 ≤ i ≤ k 1ik 1 ≤ n i ≤ 1 0 18 1 ≤ n_i ≤ 10^{18} 1ni1018 1 ≤ e i × d i ≤ 1 0 18 1 ≤ e_i × d_i ≤ 10^{18} 1ei×di1018 1 ≤ m ≤ 1 0 9 1 ≤ m ≤ 10^9 1m109

QQ截图20221107141520.png

输入样例:

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

C++代码

#include<bits/stdc++.h>
typedef long long LL;

using namespace std;

int main() {
    int tt;
    cin >> tt;
    
    while(tt --) {
        LL n, c, d, p, q;
        //n = p * q
        //c * d = p * q - p - q + 2
        //c * d = n - p - q + 2
        //t = c * d
        //p + q = n - t + 2
        //p * q = n
        cin >> n >> c >> d;
        LL t = c * d;
        LL s = n - t + 2;//p + q
        LL x = s * s;//(p + q) ^ 2
        LL y = x - 4 * n;//(p - q) ^ 2
        
        LL z = LL(sqrt(y));//|p - q|
        if(z * z != y) cout << "NO" << '\n';
        else {
            p = (s + z) / 2;
            q = (s - z) / 2;
            if(p > q) swap(p, q);
            cout << p << " " << q << '\n';
        }
    }
    
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值