线性同余方程ax≡b(mod m)

a,b,m是整数且m>0,gcd(a,m)=d,如果d|b,则方程恰有d个模m不同余的解,否则方程无解。

a=d*a0  m=d*m0

a0*x+m0*y=b/d

可以转化为扩展欧几里得

typedef long long ll;
void exgcd(ll a,ll b,ll &d,ll &x,ll &y){
	if(b==0){
		x=1;
		y=0;
		d=a;
		return ;
	}
	else{
		exgcd(d,a%b,d,x,y);
		ll temp=x;
		x=y;
		y=temp-(a/b)*y;
	}
}
int f(int a,int b,int m){
	exgcd(a,m,d,x,y);
	if(b%d)return -1;
	x=x*(b/d)%m;
	for(i=1;i<=d;i++)ans[i]=(x+(i-1)*m/d)%m;
}


你可能感兴趣的:(数论)