扩展中国剩余定理的应用

链接:https://ac.nowcoder.com/acm/problem/15068
来源:牛客网
 

uu遇到了一个小问题,可是他不想答。你能替他解决这个问题吗?
问题:给你k对a和r是否存在一个正整数x使每队a和r都满足:x mod a=r,求最小正解x或无解。

这道题必须用扩展中国剩余定理来解决,因为无论模数是否互质都可以满足次定理,即从第二个开始每次对aax+bb=a[i]y+b[i]求最小整数解,之后把每次加上aax,每次对(aa,a[i])求最小公倍数lcm。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
#include<string.h>
#include<vector>
#include<set>
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define ll long long
#define inf 0x3f3f3f3f
const int maxn=1e5+5;
using namespace std;
ll a[maxn],b[maxn];
ll r=1;
inline ll exgcd(ll a,ll b,ll &x,ll &y)
{
    if(b==0)
    {
      x=1;
      y=0;
      return a;

    }
    ll d=exgcd(b,a%b,y,x);
    y-=(a/b)*x;
    return d;
}
inline ll ex_CRT(ll a[],ll b[],ll k)
{
    ll aa=a[0],bb=[b[0],x,t;
    for(int i=1;i<k;i++)
    {
        ll cc=b[i]-bb,xx,yy;
        ll d=exgcd(aa,a[i],x,y);
        if(cc%d)return -1;
        x*=cc/d,t=a[i],x=(x%t+t)%t;
        bb=aa*x+bb,aa=aa/d*a[i],bb%=aa;
        
    }
    return (bb%aa+aa)%aa;
}
int main()
{
	IOS;
	int k;
	cin>>k;
	for(int i=0;i<k;i++){
	    cin>>a[i]>>b[i];
	}
	ll t=ex_CRT(a,b,k);
	cout<<t<<endl;
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值