• 解密【NIOIP 2022 普及组】


    描述

    给定一个正整数 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。

    用例输入 1 

    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

    用例输出 1 

    2 385
    NO
    NO
    NO
    11 78
    3 241
    2 286
    NO
    NO
    6 88

    用例输入 2 

    10
    24568598 2 12274271
    627334722 46 13636459
    1498221 26 57041
    568827088 89 6391288
    632103400 4 158012927
    256963728 1 256931611
    384696951 93 4136098
    1072093 17 62939
    831052664 1 830997667
    241254720 8 30152063
    

    用例输出 2 

    NO
    NO
    NO
    NO
    19850 31844
    15088 17031
    NO
    NO
    NO
    7978 30240
    

    用例输入 3 

    10
    840072398 1 280024133
    623267306 93 2233933
    599266096 88 3404921
    640440802 43 14892945
    473333391 3 52592599
    524657334 94 1860487
    729896857 1 1
    874546590 3 233212423
    984273150 2 492134471
    958063848 56 5702761
    

    用例输出 3 

    NO
    NO
    2 299633048
    NO
    NO
    NO
    1 729896857
    5 174909318
    NO
    NO
    
    

    提示

    以下记 m = n − e × d + 2。
    保证对于 100% 的数据,1 ≤ k ≤ 10^5,对于任意的 1 ≤ i ≤ k,1 ≤ ni ≤ 10^18, 1 ≤ ei × di ≤ 10^18, 1 ≤ m ≤ 10^9。
    测试点编号

    k≤n ≤m≤特殊性质
    110^310^310^3保证有解
    210^310^310^3
    310^310^94*10^6保证有解
    410^310^94*10^6
    510^310^910^9保证有解
    610^310^910^9
    710^510^1810^9保证若有解则p=q
    810^510^1810^9保证有解
    910^510^1810^9
    1010^510^1810^9

    代码如下:

    1. //q^2+(ed-n-2)q+n==0;
    2. #include<bits/stdc++.h>
    3. using namespace std;
    4. typedef long long ll;
    5. int main(){
    6. ll k,n,d,e;
    7. cin>>k;
    8. while(k--){
    9. cin>>n>>d>>e;
    10. ll f=e*d-n-2;
    11. //q^2+fq+n==0
    12. ll t=f*f-4*n;
    13. ll t1=sqrt(t);
    14. if(t1*t1!=t){//判断根号下的数是否为整数
    15. cout<<"NO\n";
    16. continue;
    17. }
    18. if(t1>=0){//根号下的数大于零
    19. ll x1=(-f+t1);
    20. ll x2=(-f-t1);
    21. if(x1>=0&&x2>=0&&((-f+t1)%2==0)){//判断为正整数,分子的数是否为二的倍数
    22. cout<<x2/2<<" "<<x1/2;
    23. }else{
    24. cout<<"NO";
    25. }
    26. }else{
    27. cout<<"NO";
    28. }
    29. cout<<endl;
    30. }
    31. return 0;
    32. }

    本题其实是解一元二次方程! 

     

  • 相关阅读:
    数据库之ACID
    Y4455芯片开发的433遥控流水灯方案
    23 DRF快速入门+部分源码分析
    《MongoDB入门教程》第07篇 CRUD之查找文档
    二叉树的最小深度(rust实现)
    linux安装Samba
    Docker私有仓库打开2375端口(linux)
    基于gpg的fwknop配置流程
    uniapp如何使用api相关提示框
    查看docker中的mysql版本,查看docker中容器,查看mysql版本
  • 原文地址:https://blog.csdn.net/Annconda/article/details/127740427