同余方程

1 篇文章 0 订阅

题干分析 & 思路讲解

  • ax=1(mod b),分析这个式子,可得ax+by=1(不懂看蓝书),然后用扩展欧几里得算法 可求方程的特解x0,然后再求通解x:
    x = ( x 0 + b ) % b x=(x _0+b)%b x=(x0+b)b

b就是题目中的b,将x+b后%b可以保证x为正整数,并且小于零
ps. 蓝书的标程比这个复杂多了(小小的得意一下)

程序在此

// 2020.10.17 jqsh 好难...  
#include<bits/stdc++.h>
using namespace std;
//int d;
inline void EXgcd(int a,int b,int &x,int &y){ //扩欧 
	if(!b){ //b=0时方程解易求 (即ax+by=ax+0=gcd(a,b)=gcd(a,0)=a,x=1) 
		x=1;y=0; //即ax+by=ax+0*y=a*1+b*0
//		d=a; //d是最大公因数 ps.d在此题中恒等于1,所以不求了 
		return; 
	}
	EXgcd(b,a%b,x,y); //和gcd差不多,EXgcd就是在gcd中的过程上求特解 
	int t=x;
	x=y;y=t-(a/b*y); //多项式相乘即可得出 ps.x>0,y>0 
	return;
}
int main(){
	int a,b,x,y;
	cin>>a>>b;
	EXgcd(a,b,x,y); //扩欧求ax+by=gcd(a,b)=1的一个特解 

	cout<<(x+b)%b<<endl; //终极简化版本 

//  其实简化版本1,2更好理解 
//  cout<<abs(x+b)%b<<endl; 简化版本2.0 
/******	 仔细看EXgcd中,其实x+b一直大于0 	*****/ 
//  cout<<(x%b+b)%b<<endl; 简化版本1.0 ps.x%b+b就是求绝对值 
//	在此题中d一直等于1
//	cout<<((x/d)%(b/d)+(b/d))%(b/d)<<endl; //求通解中的最小值(蓝书标程) 
//											ps.看起来好晕,还好可以简化 
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值