中国剩余定理

 对于
(s):{xa1(modm1)xa2(modm2)xa3(modm3)...xan(modmn) (s): \begin{cases} x\equiv a_1 &(mod & m_1) \\ x\equiv a_2 &(mod &m_2)\\ x\equiv a_3 &(mod &m_3)\\ ... \\x\equiv a_n &(mod &m_n)\\ \end{cases}
我们求一组通解
易知通解为
i=1naiMiM\sum _{i=1}^na_i*M_i*M
其中
M=i=1nmiM=\prod_{i=1}^nm_i

Mi=MmiM_i=\dfrac{M}{m_i}

容易看出来这样构造出的解周期为MM,只要在最后的解中%M\%M即可
Code

#include<cstdio>
#include<iostream>
using namespace std;
struct poi
{
	
	int mod,res,m,nm;
	
	
}a[10005];
int n;
void exgcd(int a,int b,int &x,int &y)
{
	if(b==0)
	{
		x=1;
		y=0;
		return ;
	}
	exgcd(b,a%b,y,x);
	y-=a/b*x;
	return ;
}
int main()
{
	
	cin>>n;
	int kkk=1;
	for(int i=1;i<=n;i++)
	{
	cin>>a[i].mod>>a[i].res;	
	kkk*=a[i].mod;
	}
	for(int i=1;i<=n;i++)
	{
		a[i].m=kkk/a[i].mod;
		//cout<<a[i].m<<endl;
	}
	int total=0;
	for(int i=1;i<=n;i++)
	{
		int x,y;
		exgcd(a[i].m,a[i].mod,x,y);
		//cout<<x<<endl;
		a[i].nm=(x%a[i].mod+a[i].mod)%a[i].mod;
		//cout<<a[i].nm<<endl;
		total+=a[i].m*a[i].nm*a[i].res;
	}	
	total%=kkk;
	cout<<total;
}

posted @ 2018-11-05 14:18  Richardluan  阅读(4)  评论(0)    收藏  举报