#include<iostream> using namespace std; /***************************************************************************/ |定理: 设a,b,m是整数, m>0, gcd(a,m)=d,若b%d!=0则无解, 若b%d=0,则ax==b(mod m) |恰有 d 个模m的不同余的解 算法过程: 先转化为ax-my=b,根据线性丢番图定理, 求出 |可能特解x0, y0; x=x0*b/d,再由 x = x0 + (m/d)*t {t->(0, d-1)} /***************************************************************************/ //扩展欧几里得求 gcd(a,b)和特解 x0 int ex_gcd(int a, int b, int & x, int & y) { if(b==0) {x = 1; y = 0; return a;} int d = ex_gcd(b, a%b, x, y); int t = x; x = y; y = t - a/b*y; return d; } //线性同余方程 求出d-1 个可行解 bool liner_mod_equation(int a, int b, int m) { int x, y; int d = ex_gcd(a, m, x, y); if(b%d!=0) return false; x = x*(b/d)%m; for(int i=0; i<d; i++) printf("%d ", x + m/d*i); return true; } int main() { int a, b, m; while(scanf("%d%d%d", &a, &b, &m)!=EOF) { if(a==0) break; if(liner_mod_equation(a, b, m)) printf("/n"); else printf("no answer/n"); } return 0; }