decode
题目描述
给定一个正整数 k,有k 次询问,每次给定三个正整数n , e , d ,求两个正整数 p ,q ,使
n = p ×q
、e ×d =(p − 1) (q − 1) + 1
思路分析
这题是 暴力 数学
再看这两个式子(以下是初三数学)
解关于p,q二元二次方程组 n=pq ed=(p-1)(q-1)+1 ed=(p-1)q-(p-1)1+1 ed=(p-1)q-(p-1)+1 ed=pq-q-p+1+1 ed=n-q-p+2 p=n/q ed=n-q-n/q+2 edq=q(n-q-n/q+2) edq=qn-qq-n+2q edq=(-qq)+(n+2)q-n (-qq)+(n+2)q-n=edq (-qq)+(n+2-ed)q-n=0 a=-1 b=n+2-ed c=-n q=(-(n+2-ed)±sqrt(b^2-4ac))/2a p=n/q
好了,写代码吧(注:一定要判断delta正负性)
#include<iostream> #include<cmath> #define int long long using namespace std; signed main(){ freopen("decode.in","r",stdin); freopen("decode.out","w",stdout); int k; cin>>k; while(k--){ int n,d,e; cin>>n>>d>>e; int a=-1; int b=n+2-e*d; int c=-n; int delta=b*b-4*a*c; if(delta<0){ cout<<"NO\n"; continue; }else if(delta==0){ cout<<-b/(2*a)<<" "<<n/(-b/(2*a))<<"\n"; continue; }else{ int sq=sqrt(delta); int q1=(-b+sq)/(2*a); int p1=n/q1; int q2=(-b-sq)/(2*a); int p2=n/q2; if(p1>q1) swap(p1,q1); if(p2>q2) swap(p2,q2); if(p1>0&&q1>0&&p1*q1==n&&e*d==(p1-1)*(q1-1)+1){ cout<<p1<<" "<<q1<<"\n"; }else if(p2>0&&q2>0&&p2*q2==n&&e*d==(p2-1)*(q2-1)+1){ cout<<p2<<" "<<q2<<"\n"; }else{ cout<<"NO\n"; } } } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人