对于形如 a*x = b(mod m) x为未知数的一元同余线性方程
已知a,b,m为整数 (m>0) 设d=(a,m) 如果d|b,则这个方程恰好有d个模m不同余的解,否者方程无解。
设 a = d * a0, m = d * m0;
方程可以变换为 a0 * x + m0 *y = b/d;
方程的解为 x, x+m0,x+2m0,...........x+(d-1)m0;
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int ans[1000];
void ex_gcd(int a,int b,int &d,int &x,int &y)
{
if(!b){
x=1;
y=0;
d=a;
return ;
}
else{
ex_gcd(b,a%b,d,x,y);
int tmp = x;
x=y;
y=tmp-(a/b)*y;
}
}
int main()
{
int a,b,m;
int d,x,y;
while(cin>>a>>b>>m){
ex_gcd(a,m,d,x,y);
if(b%d){
cout<<"No answer"<<endl;
}
else{
x=x*(b/d)%m;
for(int i=1;i<=d;i++){
ans[i]=(x+(i-1)*m/d)%m;
cout<<ans[i]<<" ";
}
cout<<endl;
}
}
return 0;
}
一元线性同余方程组:
x=b1(mod m1)
x=b2(mod m2)
方程有解得条件为 (m1,m2)|(b1-b2)
方程等价于
x=b1+m1*y1;
x=b2+m2*y2;
联立可得 b1+m1*y1=b2+m2*y2
即 m2*y2 -m1*y1 =b1-b2
由解线性同余方程 可得到方程的解 y2
方程组小于m的解为 (b2+m2*y2)%m;
假设同余方程组为
x=r1(mod a1)
x=r2(mod a2)
......
x=rn(mod an)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
void ex_gcd(int a,int b,int &d,int &x,int &y)
{
if(!b){
x=1;
y=0;
d=a;
}
else{
ex_gcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
int n;
int slove()
{
int a1,r1,a2,r2;
int a,b,c,x,y,d;
bool l=1;
cin>>a1>>r1;
for(int i=1;i<n;i++){
cin>>a2>>r2;
a=a1,b=a2,c=r2-r1;
ex_gcd(a,b,d,x,y);
if(c%d!=0)
l=0;
int t=b/d;
x=(x*(c/d)%t+t)%t;
r1=a1*x+r1;
a1=a1*(a2/d);
}
if(!l)
return -1;
else
return r1;
}
int main()
{
while(cin>>n){
int t=slove();
if(t==-1)
cout<<"No answer"<<endl;
else
cout<<t<<endl;
}
return 0;
}