数论——中国剩余定理

含义

中国剩余定理:
m1,m2,,mk k 个两两互质的正整数, Mi=Mmi(i=1,2,3,,k)b1,b2,,bk 为任意整数,则同余式组

xb1(modm1),,xbk(modmk)

有唯一解 xM1M1b1++MkMibk(modM) ,其中满足 MiMi1(modm)i(i=1,2,,k)

思维训练

问题描述

今有物不知其数,三三数之余二;五五数之余三;七七数之余二。问物几何?

问题分析

答案是23。
我们要先解三个特殊的同余方程组。

x1(mod3)x0(mod5)x0(mod7)

x0(mod3)x1(mod5)x0(mod7)

x0(mod3)x0(mod5)x1(mod7)

100=70

010=21

001=15

所以
232=2100+3010+2001=2×70+3×21+2×1523(mod105)

通过这个例子,大家都应该知道中国剩余定理怎么用了吧。

代码

int extended_gcd(int a,int b,int &x,int &y)
{
    int ret,tmp;
    if(!b)
    {
        x=1;
        y=0;
        return a;
    }
    ret=extended_gcd(b,a%b,x,y);
    tmp=x;
    x=y;
    y=tmp-a/b*y;
    return ret;
}
int China(int W[],int B[],int k)
{
    int x,y,a=0,m,n=1;
    for(int i=0;i*=W[i];
    for(int i=0;im=n/W[i];
        extended_gcd(W[i],m,x,y);
        a=(a+y*m*B[i])%n;
    }
    return a>0 ? a:a+n;
}

曹冲养猪

曹冲养猪题目地址

分析

裸的中国剩余定理!

代码

这道题目坑的地方就是炸int。

#include
using namespace std;
inline long long read()
{
    long long num=0;
    char c=' ';
    bool flag=true;
    for(;c>'9'||c<'0';c=getchar())
        if(c=='-')
            flag=false;
    for(;c>='0'&&c<='9';num=num*10+c-48,c=getchar());
    return flag ? num : -num;
}
#define maxn 12
long long a[maxn],b[maxn];
long long n;
long long exgcd(long long a,long long  b,long long &x,long long &y)
{
    if(b==0)
    {
        x=1;y=0;
        return a;
    }
    long long gcd=exgcd(b,a%b,x,y);
    long long  t=x;
    x=y;
    y=t-a/b*y;
    return gcd;
}
long long China()
{
    long long x,y,ans=0,m,pai=1;
    for(int i=1;i<=n;i++)
        pai*=a[i];
    for(int i=1;i<=n;i++)
    {
        m=pai/a[i];
        exgcd(a[i],m,x,y);
        ans=(ans+y*m*b[i])%pai;
    }
    return ans>0 ? ans : ans+pai;
}
int main()
{
    n=read();
    for(int i=1;i<=n;i++)
    {
        a[i]=read();
        b[i]=read();
    }
    printf("%lld\n",China());
    return 0;
}

你可能感兴趣的:(数论数学,数论,中国剩余定理,数论)