[CSP-J 2022] 解密题解

题目链接

60分做法

枚举。注意开long long。

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,e,d, p,q;
inline void cal(){
    for(int i=1;i*i<=n;i++){
        if(n%i == 0){
            p = i;
            q = n/i;
            if(e*d == (p-1)*(q-1)+1){
                printf("%d %d\n",p,q);
                return;
            }
        }
    }
    printf("NO\n");
}
signed main() {
    int k;scanf("%lld",&k);
    while(k--){
        scanf("%lld%lld%lld",&n,&e,&d);
        cal();
    }
    return 0;
}

AC做法

推公式计算,数据范围记 m = n − e ∗ d + 2 m = n-e*d+2 m=ned+2 其实就是提示。

e ∗ d = ( p − 1 ) ∗ ( q − 1 ) + 1 p ∗ q − ( p + q ) + 2 → p + q = p ∗ q − e ∗ d + 2 = n − e ∗ d + 2 = m e*d = (p-1)*(q-1)+1 p*q - (p+q) +2\to p+q = p*q-e*d+2 = n - e*d+2 = m ed=(p1)(q1)+1pq(p+q)+2p+q=pqed+2=ned+2=m

p − q = ( p + q ) 2 − 4 ∗ p q = m 2 − 4 ∗ n p-q = \sqrt{(p+q)^2-4*pq} = \sqrt{m^2-4*n} pq=(p+q)24pq =m24n

解方程组:
{ p − q = m 2 − 4 ∗ n p + q = m \begin{cases} p-q = \sqrt{m^2-4*n} \\ p+q = m \end{cases} {pq=m24n p+q=m

{ p = m − t 2 , t = m 2 − 4 ∗ n q = m + t 2 \begin{cases} p = \frac{ m-t} {2} , t = \sqrt{m^2-4*n}\\ q = \frac{m+t}{2} \end{cases} {p=2mt,t=m24n q=2m+t

注意几个细节:

  • t < 0时无解
  • p、q都是正整数,且 p <= q
  • double存在精度问题,最后要加一个判断
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,e,d,p,q;
inline void cal(){
    int m = n-e*d+2;
    int t = m*m-4*n;
    if(t<0) {printf("NO\n");return;}
    p = (m-sqrt(t))/2,q=(m+sqrt(t))/2;
    if(p>0 && q>0 && p*q == n && (p-1)*(q-1)+1 == d*e){
        printf("%ld %ld\n",p,q);
    }else{
        printf("NO\n");
    }    
}
signed main() {
    int k;scanf("%lld",&k);
    while(k--){
        scanf("%lld%lld%lld",&n,&d,&e);
        cal();
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值