中国剩余定理:
设 m1,m2,…,mk 是 k 个两两互质的正整数, Mi=Mmi(i=1,2,3,…,k),b1,b2,…,bk 为任意整数,则同余式组
今有物不知其数,三三数之余二;五五数之余三;七七数之余二。问物几何?
答案是23。
我们要先解三个特殊的同余方程组。
通过这个例子,大家都应该知道中国剩余定理怎么用了吧。
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;
}