中国剩余定理模板(JZOJ 3093. 【NOIP2012模拟11.7】合唱队形)

Description

学校要进行合唱比赛了,于是班主任小刘准备给大家排个队形。

他首先尝试排成m1行,发现最后多出来a1个同学;接着他尝试排成m2行,发现最后多出来a2个同学,……,他们尝试了n种排队方案,但每次都不能让同学们正好排成mi行。于是小刘寻求同事小明的帮助,以便给同学们排好队型。但小刘来去太匆忙,忘记告诉小明他们班有多少人了。没办法,现在只能根据上述信息求个满足要求的最小的数字来作为人数了。

虽然小明年轻时是理科生,但是他不愿意去思考这个问题;于是他找到了善于编程的你,希望你能通过编程来解决。

Input

第一行为一个整数n,表示小刘尝试了n种排队方案。

接下来n行,每行有两个整数mi,ai,表示小刘在第i种排队方案中,尝试让同学排成mi行,最后多出来ai个同学。

Output

每个输出文件只有一个整数,表示最少学生数,如果找不到这样的整数,说明小刘口误了,输出-1。

Sample Input

3

3 1

5 1

7 2

Sample Output

16

Data Constraint

Hint

对于100%的测试数据,满足n<=10,0

Code

#include <cstdio>
#include <iostream>
#include <cmath>/
#include <algorithm>
#define mo 1000000007
#define fo(i,a,b) for (int i=a;i<=b;i++)
using namespace std;
long long m[15],a[15];
int n;
long long Exgcd(long long a,long long b,long long &x,long long &y)
{
    if (!b) 
    {
        x=1;y=0;
        return a;
    }
    long long d=Exgcd(b,a%b,x,y);
    long long t=x;
    x=y;
    y=t-(a/b)*y;
    return d;
}
long long CRT(long long a[],long long m[],int n)  
{  
    long long M=1;  
    long long ans=0;  
    fo(i,1,n) M*=m[i];  
    fo(i,1,n)
    {  
        long long x=0, y=0;  
        long long Mi=M/m[i];  
        Exgcd(Mi,m[i],x,y); 
        ans=(ans+Mi%M*x%M*a[i]%M+M)%M;  
    }  
    if(ans<0) ans+=M;  
    return ans;  
}  
int main()
{
    freopen("data.in","r",stdin);
    scanf("%d",&n);
    fo(i,1,n)
    {
        if (i==1)
        {
            scanf("%lld%lld",&m[1],&a[1]);
            continue;
        }
        scanf("%lld%lld",&m[i],&a[i]);
        long long x=0,y=0;
        long long c=a[i]-a[1],d=Exgcd(m[1],m[i],x,y);
        if (c%d) 
        {
            printf("-1\n");
            return 0;
        } 
        x*=(c/d);
        x=((x%m[i])+m[i])%m[i];
        a[1]=m[1]*x+a[1];
        m[1]=m[1]/d*m[i];
        a[1]=a[1]%m[1];
    }
    printf("%lld",a[1]);  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值