中國剩餘定理

#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: ";
        }
}
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息