1 solutions

  • 0
    @ 2024-11-28 17:59:33

    中国剩余定理

    m1,m2,,mnm_1,m_2,…,m_n 是两两互质的整数,m=i=1nmim=\prod_{i=1} ^n m_i

    Mi=m/miM_i=m/m_i

    tit_i是线性同余方程Miti1(mod mi)M_it_i \equiv 1(mod\ m_i)的一个解。

    对于任意的nn个整数 a1,a2,,ana_1,a_2,…,a_n方程组

    x=i=1naiMit1 x = \sum _{i=1}^n a_iM_it_1 是原方程的一个解.

    代码实现

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int N=15;
    LL a[N],m[N];
    LL exgcd(LL a,LL b,LL &x,LL &y)
    {
    	if(!b)
    	{
    		x=1,y=0;
    		return a;
    	}
    	else
    	{
    		LL d=exgcd(b,a%b,y,x);
    		y=y-a/b*x;
    		return d;
    	}
    }
    int main()
    {
    	int n;
    	cin>>n;
    	LL M=1;
    	for(int i=1;i<=n;i++)
    	{
    		cin>>m[i]>>a[i];
    		M*=m[i];//读入m[i]的同时计算M 
    	}
    	LL res=0;
    	for(int i=1;i<=n;i++)
    	{
    		LL Mi=M/m[i];//计算Mi
    		LL ti,y;
    		exgcd(Mi,m[i],ti,y); //ti*Mi+y*mi=1
    		res+=a[i]*Mi*ti; 
    	}
    	cout<<(res%M+M)%M<<endl;
    	return 0;
    }
    
    • 1

    Information

    ID
    1914
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    7
    Tags
    (None)
    # Submissions
    1
    Accepted
    1
    Uploaded By