关于exgcd
关于exgcd
对于二元一次不定方程
首先由裴蜀定理得,
void exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1;y=0;
return;
}
exgcd(b,a%b);
int tmp=x;
x=y;
y=tmp-a/b*y;
}
对于方程两边同时乘以,得到一组特解
考虑推通解:
令 为满足要求的 的最小整数, 为满足要求的 的最小整数,因为 都是整数,当时
方程通解可以表示为:
当 时
当 时
同时取到正整数,当且仅当
当取得最小值时,取得最大值
void work(){
int a=read(),b=read(),c=read();
int x=0,y=0;
int g=exgcd(a,b,x,y);
if(c%g!=0){//根据裴蜀定理,g不整除必无解
printf("-1\n");
return;
}
x=x*c/g;y=y*c/g;//求出特解
int kx=b/g;
int ky=a/g;
int l=ceil(1.0*(-x+1)/kx);
int r=floor(1.0*(y-1)/ky);
if(l<=r){//两个都是正整数
int num=r-l+1;//解的个数
//当x取最小时,y对应取最大
int minx=x+l*kx,maxy=y-l*ky;
//当y取最小时,x对应取最大
int miny=y-r*ky,maxx=x+r*kx;
//printf("%lld %lld %lld\n",x,r,kx);
printf("%lld %lld %lld %lld %lld\n",num,minx,miny,maxx,maxy);
}
else{
int minx=x+l*kx;
int miny=y-r*ky;
printf("%lld %lld\n",minx,miny);
}
}
This is your dream.Anything you can dream,you can do it now.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探