说句实话..学的不快,但是忘是忘的快..
为什么要回顾ex_gcd呢?因为中国剩余定理要用逆元hh,所以我们要用ex_gcd求下数的逆元~
我先把ex_gcd敲一下..
#include <bits/stdc++.h> using namespace std; int x,y;//解这个 ai∗xi+bi∗yi=gcd(ai,bi) void ex_gcd(int a,int b) { if(b==0) { x=1,y=0; return; } ex_gcd(b,a%b); int cx=x,cy=y; x=cy;y=(cx-a/b*cy); } int main() { int t,a,b; cin>>t; while(t--) { cin>>a>>b; ex_gcd(a,b); cout<<x<<' '<<y<<endl; } return 0; }
emm,好像没啥要多解释的,还是讲下吧...就是首先找到一组符合条件的解,就是x取1,y取0.然后后面就是直接递归就好了.
知道当前这一步x,y,后面就是x=cy;y=(cx-a/b*cy);就好了~
逆元是什么?
然后下面就是讲中国剩余定理了,什么是中国剩余定理呢?emm我觉得打字太麻烦了,有意向的直接看题好吧!
https://www.acwing.com/problem/content/1300/ 大概就是这个题目的意思,给你就是说找模数和余数,让你找到x使得x取模满足条件.emm要最小..怎么做呢?
就是中国剩余定理了,中国剩余定理是什么呢?
令M=m1 *...mn.然后ti是Mi关于mi的逆元.Mi是M/mi.ai是
构造 1~n ti Mi ai.
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll N=12; ll x,y; ll m[N]; ll a[N],b[N],t[N];//t数组是m数组关于a数组的逆元. void ex_gcd(ll aa,ll bb) { if(bb==0) { x=1,y=0; return; } ex_gcd(bb,aa%bb); ll cx=x,cy=y; x=cy,y=cx-aa/bb*cy; } int main() { int n; cin>>n; for(int i=1;i<=n;i++) { scanf("%lld%lld",&a[i],&b[i]); } ll M=1; for(int i=1;i<=n;i++) { M*=a[i]; } for(int i=1;i<=n;i++) { m[i]=M/a[i]; } for(int i=1;i<=n;i++) { ll aa,bb; aa=m[i];bb=a[i]; ex_gcd(aa,bb); t[i]=x; } ll res=0; for(int i=1;i<=n;i++) { res+=m[i]*t[i]*b[i]; } cout<<(res%M+M)%M<<endl; return 0; }
代码~