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

来源:互联网 发布:软件验收测试报告模板 编辑:程序博客网 时间:2024/05/18 09:09

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]);  }
1 0
原创粉丝点击