Hello Kiki(hdu3579+不互质的中国剩余定理)

Hello Kiki

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d
& %I64u

Submit Status Practice HDU
3579

Appoint description: 
System Crawler  (2015-04-29)

Description

One day I was shopping in the supermarket. There was a cashier counting coins seriously when a little kid running and singing "门前大桥下游过一群鸭,快来快来 数一数,二四六七八". And then the cashier put the counted coins back morosely and count again...

Hello Kiki is such a lovely girl that she loves doing counting in a different way. For example, when she is counting X coins, she count them N times. Each time she divide the coins into several same sized groups and write down the group size Mi and the number
of the remaining coins Ai on her note.

One day Kiki‘s father found her note and he wanted to know how much coins Kiki was counting.

Input

The first line is T indicating the number of test cases.

Each case contains N on the first line, Mi(1 <= i <= N) on the second line, and corresponding Ai(1 <= i <= N) on the third line.

All numbers in the input and output are integers.

1 <= T <= 100, 1 <= N <= 6, 1 <= Mi <= 50, 0 <= Ai < Mi

Output

For each case output the least positive integer X which Kiki was counting in the sample output format. If there is no solution then output -1.

Sample Input

 2
2
14 57
5 56
5
19 54 40 24 80
11 2 36 20 76 

Sample Output

 Case 1: 341
Case 2: 5996 

先可以先找两个同余方程 设通解为N;

N=r1(mod(m1)),N=r2(mod(m2));

显然可以化为k1*m1+r1=k2*m2+r2;--->k1*m1+(-k2*m2)=r2-r1;

设a=m1,b=m2,x=k1,y=(-k2),c=r2-r1方程可写为ax+by=c;

由欧几里得解得x即可,那么将x化为原方程的最小正整数解,(x*(c/d)%(b/d)+(b/d))%(b/d);

这里看不懂的去看解模线性方程。那么这个x就是原方程的最小整数解。

所以N=a*(x+n*(b/d))+r1====N=(a*b/d)*n+(a*x+r1),

这里只有n为未知数所以又是一个N=(a*x+r1)(mod(a*b/d))的式子,

然后只要不断的将两个式变成一个式子,最后就能解出这个方程组的解。

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3579

转载请注明出处:寻找&星空の孩子

孩子的专栏

#include<stdio.h>
#define LL __int64

void exgcd(LL a,LL b,LL& d,LL& x,LL& y)
{
    if(!b){d=a;x=1;y=0;}
    else
    {
        exgcd(b,a%b,d,y,x);
        y-=x*(a/b);
    }
}
LL gcd(LL a,LL b)
{
    if(!b){return a;}
    gcd(b,a%b);
}

LL M[55],A[55];

LL China(int r)
{
    LL dm,i,a,b,x,y,d;
    LL c,c1,c2;
    a=M[0];
    c1=A[0];
    for(i=1; i<r; i++)
    {
        b=M[i];
        c2=A[i];
        exgcd(a,b,d,x,y);
        c=c2-c1;
        if(c%d) return -1;//c一定是d的倍数,如果不是,则,肯定无解
        dm=b/d;
        x=((x*(c/d))%dm+dm)%dm;//保证x为最小正数//c/dm是余数,系数扩大余数被
        c1=a*x+c1;
        a=a*dm;
    }
    if(c1==0)//余数为0,说明M[]是等比数列。且余数都为0
    {
        c1=1;
        for(i=0;i<r;i++)
            c1=c1*M[i]/gcd(c1,M[i]);
    }
    return c1;
}
int main()
{
    int T,n,t=0;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%I64d",&M[i]);
        }
        for(int i=0;i<n;i++)
        {
            scanf("%I64d",&A[i]);
        }

        LL ans=China(n);
        printf("Case %d: %I64d\n",++t,ans);

    }
    return 0;
}

/*
20
2
14 57
5 56
5
19 54 40 24 80
11 2 36 20 76
2
14 57
5 56
2
19 54
11 2
*/
时间: 2024-10-12 14:07:17

Hello Kiki(hdu3579+不互质的中国剩余定理)的相关文章

hdu 1573 X问题 (非互质的中国剩余定理)

X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2980    Accepted Submission(s): 942 Problem Description 求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], …, X mod

poj 2891 Strange Way to Express Integers (非互质的中国剩余定理)

Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 9472   Accepted: 2873 Description Elina is reading a book written by Rujia Liu, which introduces a strange way to express non-negative integers. The way is

hdu 1573 X问题 两两可能不互质的中国剩余定理

X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], …, X mod a[i] = b[i], … (0 < a[i] <= 10). Input 输入数据的第一行为一个正整数T,

exgcd&amp;&amp;中国剩余定理专题练习

hdu1573求中国剩余定理解的个数 #include <iostream> #include <cstdio> using namespace std; int a[100],b[100]; int exgcd(int a,int b,int &x,int &y){ if(b==0){ x=1;y=0;return a; } int d=exgcd(b,a%b,x,y),t; t=x;x=y;y=t-a/b*y; return d; } int main(){ i

Hello Kiki(中国剩余定理——不互质的情况)

Hello Kiki Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 247 Accepted Submission(s): 107   Problem Description One day I was shopping in the supermarket. There was a cashier counting coins serio

中国剩余定理 互质与非互质版本

中国剩余定理互质版 设m1,m2,m3,...,mk是两两互素的正整数,即gcd(mi,mj)=1,i!=j,i,j=1,2,3,...,k. 则同余方程组: x = a1 (mod n1) x = a2 (mod n2) ... x = ak (mod nk) 模[n1,n2,...nk]有唯一解,即在[n1,n2,...,nk]的意义下,存在唯一的x,满足: x = ai mod [n1,n2,...,nk], i=1,2,3,...,k. 解可以写为这种形式: x = sigma(ai* 

Chinese remainder theorem again(中国剩余定理+不互质版+hud1788)

Chinese remainder theorem again Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1788 Appoint description:  System Crawler  (2015-04-27) Description 我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的: 假设m1,m2,-,m

POJ 2891 中国剩余定理的非互质形式

中国剩余定理的非互质形式 任意n个表达式一对对处理,故只需处理两个表达式. x = a(mod m) x = b(mod n) km+a = b (mod n) km = (a-b)(mod n) 利用扩展欧几里得算法求出k k = k0(mod n/(n,m)) = k0 + h*n/(n,m) x = km+a = k0*m+a+h*n*m/(n,m) = k0*m+a (mod n*m/(n,m)) #include <cstdio> #include <cstring> #

poj 2981 Strange Way to Express Integers (中国剩余定理不互质)

http://poj.org/problem?id=2891 Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 11970   Accepted: 3788 Description Elina is reading a book written by Rujia Liu, which introduces a strange way to express no