单点时限: 2.0 sec
内存限制: 256 MB
形如 ax≡b(modm) 的方程,称为线性同余方程。编写程序求解线性同余方程(基于欧几里德算法)。
输入格式
测试包含多组测试数据。
每组测试数据只含一行,每行有三个整数 a,b,m (0<a,b,m<1 000 000)
输出格式
每组测试数据只输出一行。如果在 m 的同余系下有解,则按解的大小,从小到大输出,两两之间用空格分开。如果没有解,则输出 No Answer.
样例
input
12 54 34
4 2 4
output
13 30
No Answer.
欧几里得算法参见
#include<iostream>
#include<algorithm>
using namespace std;
int exGcd(int a,int b,int &x,int &y) {
if(b==0) {
x=1;
y=0;
return a;
}
int g = exGcd(b,a%b,x,y);
int t = x;
x=y;
y=t-a/b*y;
return g;
}
int main() {
int a,b,m;
while(cin>>a>>b>>m) {
if(b%__gcd(a,m)!=0)
cout<<"No Answer."<<endl;
else {
int x,y,g;
g=exGcd(a,m,x,y);
int r=m/g;
int x0=(b/g*x%r+r)%r;
for(int i = 0; i < __gcd(a,m); i++)
cout<<x0+m/__gcd(a,m)*i<<" ";
cout<<endl;
}
}
}