您的位置:首页 > 其它

解线性同余方程组-模板

2016-06-01 22:59 183 查看
int n;
LL a[K],b[K];
LL gcd(LL a,LL b)
{
return b==0?a:gcd(b,a%b);
}
void exgcd(LL a,LL b,LL &d,LL &x,LL &y)
{
if(b==0)
{
x=1;y=0;d=a;
return;
}
exgcd(b,a%b,d,y,x);
y-=x*(a/b);
}
LL slove(void)//x=b[i](mod a[i])
{
LL ta=a[0],tb=b[0];
bool flag=true;
for(int i=1;i<n;i++)
{
LL xa=ta,xb=a[i],c=b[i]-tb,d,x,y;
exgcd(xa,xb,d,x,y);
if(c%d)
{
flag=false;break;
}
LL tm=xb/d;
x=(x*(c/d)%tm+tm)%tm;
tb=ta*x+tb;
ta=ta/d*a[i];
}
if(!flag)
return -1;
return tb;
}

解出的是最小正整数解

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: