解一次模互质同余方程组

pku1006, 解一次模互质同余方程组

x=p mod 23;

x=e mod 28;

x=i  mod 33;

求x

 

#include <iostream> #include <vector> using namespace std; int gcd(int m, int n) // 用户必须保证m,n的合法性! { int temp; while( m%n != 0 ) { temp = m; m = n; n = temp%n; } return n; } bool crf(int a,int b,int m,vector<int>& r) { int gcdn=gcd(a,m); b%=m; b=(b+m)%m; if(b%gcdn!=0) return false; int i; int k=0; r.clear(); for(i=0;i<m;i++) { if((a*i)%m==b) { r.push_back(i); k++; if(k==gcdn) break; } } return true; } // 解一次模互质同余方程组 // 方程组形式是 x≡ai(mod mi) // 解为x≡rb(mod rm) class Node { public: int a,m; }; void crfs(vector<Node> &v,int &rb,int &rm) { int s=v.size(); vector<int>M,_M; M.resize(s,0); _M.resize(s,0); int i; rm=1; for(i=0;i<s;i++) rm*=v[i].m; for(i=0;i<s;i++) M[i]=rm/v[i].m; vector<int>t; for(i=0;i<s;i++) { crf(M[i],1,v[i].m,t); _M[i]=t[0]; } rb=0; for(i=0;i<s;i++) rb+=M[i]*_M[i]*v[i].a; rb%=rm; rb=(rb+rm)%rm; } int main() { int p, e, i, s, t=0; int rb, rm; //freopen("data.txt", "r", stdin); while (cin >> p >> e >> i >> s) { if (p==-1 && e==-1 && i==-1 && s==-1) break; t++; vector<Node> vn; Node node1, node2, node3; node1.a = p; node1.m = 23; node2.a = e; node2.m = 28; node3.a = i; node3.m = 33; vn.push_back(node1); vn.push_back(node2); vn.push_back(node3); crfs(vn, rb, rm); cout << "Case " << t << ": the next triple peak occurs in "; if (s % rm == rb) cout << s+rm << " days." << endl; else cout << (rb-s+rm) % rm << " days." << endl; } return 0; }

你可能感兴趣的:(解一次模互质同余方程组)