2022 CCF CSP-J2 解密

这篇博客介绍了一种算法来处理正整数问题,通过询问次数,找到满足ni=p*q且c*d=p*q-p-q+2的整数pi和qi。关键步骤包括计算t=c*d和p+q=n-t+2的解决方案,最后提供了C++代码实现。

给定一个正整数kkk,有kkk 次询问,每次给定三个正整数nin_ini, eie_iei, did_idi,求两个正整数 pi,qip_i,q_ipi,qi,使 ni=pi×qin_i = p_i × q_ini=pi×qiei×di=(pi−1)(qi−1)+1e_i × d_i = (p_i − 1)(q_i − 1) + 1ei×di=(pi1)(qi1)+1

输入格式
第一行一个正整数kkk,表示有 kkk 次询问。
接下来kkk行,第 i 行三个正整数 ni,di,ein_i, d_i, e_ini,di,ei
输出格式
输出 kkk 行,每行两个正整数 pi,qip_i, q_ipi,qi 表示答案。
为使输出统一,你应当保证 pi≤qip_i ≤ q_ipiqi

如果无解,请输出 NO

数据范围
以下记 m=n−e×d+2m = n − e × d + 2m=ne×d+2
保证对于 100%100\%100% 的数据,1≤k≤1051 ≤ k ≤ 10^51k105,对于任意的 1≤i≤k1 ≤ i ≤ k1ik1≤ni≤10181 ≤ n_i ≤ 10^{18}1ni10181≤ei×di≤10181 ≤ e_i × d_i ≤ 10^{18}1ei×di10181≤m≤1091 ≤ m ≤ 10^91m109

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;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值