中国剩余定理

中国剩余定理

M = ∏ i = 1 n m i M= {\textstyle \prod_{i=1}^{n}}m_i M=i=1nmi, , M i = M m i M_i=\frac{M}{m_i} Mi=miM , t i ∗ M i ≡ 1 ( m o d    m i ) t_i*M_i \equiv1(mod \ \ m_i ) tiMi1(mod  mi)


a i ∗ t i ∗ M i ≡ a i ( m o d    m i ) a_i*t_i*M_i \equiv a_i(mod \ \ m_i ) aitiMiai(mod  mi)
a j ∗ t j ∗ M j ≡ 0 ( m o d    m i ) a_j*t_j*M_j \equiv 0(mod \ \ m_i ) ajtjMj0(mod  mi)

所以可以构造出答案 X X X
X = ∏ i = 1 n M i t i a i {\large {\color{Blue} \mathbf{X= {\textstyle \prod_{i=1}^{n}} M_it_ia_i} } } X=i=1nMitiai

#include<bits/stdc++.h>
#define I inline
#define int long long
#define RI register int 
using namespace std;
I int read()
{
	RI res=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
	while(isdigit(ch)){res=(res<<1)+(res<<3)+(ch&15);ch=getchar();}
	return res*f;
}
int n,a,b,w[15];int x,y;
I void exgcd(int a,int b){
	if(!b){x=1;y=0;return;}
	exgcd(b,a%b);
	int k=x;x=y;y=k-a/b*y;
}
int M=1, m[150000];
int X;
signed main()
{
	n=read(); 
	for(RI i=1;i<=n;i++){m[i]=read();w[i]=read();M*=m[i];}
	for(RI i=1;i<=n;i++){
		exgcd(M/m[i],m[i]);
		X+=(x<0 ? x+m[i]:x)*(M/m[i])*w[i];
	}
	printf("%lld",X%M);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值