• 解密【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. }

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

     

  • 相关阅读:
    Linux登录界面
    编曲学习:钢琴编写 人性化、逻辑预制 工程音频导出
    mysql数据库SQL语句大全详解(下)
    软考信息系统项目管理师_历年真题_2019上半年错题集_上午综合知识题---软考高级之信息系统项目管理师054
    树、二叉树、森林的相互转化
    构造、清理、拷贝和移动简单实例
    C盘清理教程
    经典矩阵试题(一)
    八股文(Web篇——网络通讯部分)第十二天
    Kubernetes----基于kubeadm工具在CentOS7.9虚拟机上部署一主两从类型的Kubernetes集群环境
  • 原文地址:https://blog.csdn.net/Annconda/article/details/127740427