#include<bits/stdc++.h> using namespace std; vector<pair<int,int> > equation_set; int get_inv(int n,int x){ int nn=n; x=x%n; pair<int,int> X(0,1),N(1,0); while(x){ N={N.first-n/x*X.first,N.second-n/x*X.second}; n=n%x; swap(n,x); swap(N,X); } if(n==1)return (N.second%nn+nn)%nn; else return 0; } int degrade(int n,int x){ for(int i=2,p=1;i*i<=n;++i,p=1){ if(n%i)continue; while(n%i==0){ p*=i; n/=i; } equation_set.emplace_back(p,x%p); } if(n>1)equation_set.emplace_back(n,x%n); } void print_equation_set(){ for(auto &a: equation_set) cout<<"x = "<<a.second<<" (mod "<<a.first<<")\n"; } int main(){ ios::sync_with_stdio(0); int n,x,num; cout<<"=======================================\n"; cout<<"equation number: "; while(cin>>num){ cout<<"# if x=a(mod b), then input b a\n"; equation_set.clear(); //input while(num--){ cin>>n>>x; degrade(n,x%n); } //output sort(equation_set.begin(),equation_set.end()); cout<<"\ndegraded equations:\n"; print_equation_set(); //arrange vector<pair<int,int> > tmp; vector<bool> vis(equation_set.size(),false); bool error=false; for(int i=0,j,last;i<equation_set.size()&&!error;++i){ if(vis[i])continue; for(last=i,j=i+1;j<equation_set.size();++j) if(!vis[j]&&equation_set[j].first%equation_set[i].first==0){ vis[j]=1; if(equation_set[j].second%equation_set[last].first!=equation_set[last].second){ error=true; break; } last=j; } tmp.emplace_back(equation_set[last]); } if(!error){ equation_set=tmp; cout<<"\nrearranged equations:\n"; print_equation_set(); int ans=0,pro=1; for(auto &a: equation_set)pro*=a.first; for(auto &a: equation_set)ans=(ans+pro/a.first*get_inv(a.first,pro/a.first)*a.second)%pro; cout<<"\nanswer:\n"<<"x = "<<ans<<" (mod "<<pro<<")\n\n"; }else cout<<"\nerror\n\n"; cout<<"=======================================\n"; cout<<"equation number: "; } }