您的位置:首页 > 其它

Hello Kiki(hdu3579线性同与方程)

2013-10-26 15:13 309 查看
题意:X = Ai (mod Mi) 给你Ai和Mi 计算最小正整数x,最小正整数解不能是0,如果为0那么解就是n个Ai的最小公倍数

思路:线性同余方程组

线性同余方程组解法:/article/10243984.html

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long int64;

int64 Exgcd(int64 a,int64 b,int64& x,int64 &y)
{
if(b == 0)
{
x = 1,y = 0;
return a;
}
else
{
int64 r = Exgcd(b,a%b,x,y);
int64 temp = x;
x = y; y = temp - a/b*y;
return r;
}
}
int64 A[10];
int64 R[10];

int main()
{
int t,cas = 1;
scanf("%d",&t);
while(t--)
{
int64 n;
scanf("%I64d",&n);
for(int i = 0; i < n; i++)
{
scanf("%I64d",&A[i]);
}
for(int i = 0; i < n; i++)
{
scanf("%I64d",&R[i]);
}
bool flag = 1;
int64 a1 = A[0],r1 = R[0],x,y;
for(int i = 1; i < n; i++)
{
int64 a = a1,b = A[i],c = R[i] - r1,d;
d = Exgcd(a,b,x,y);
if(c % d != 0)
{
flag = 0;break;
}
b = b / d;
x = x * (c/d);
x = (x % b + b) % b;
r1 = x * a1 + r1;
a1 = a1*(A[i]/d);
}
if(flag)
{
if(r1 != 0)
printf("Case %d: %I64d\n",cas++,r1);
else
printf("Case %d: %I64d\n",cas++,r1+a1);
}
else
printf("Case %d: -1\n",cas++);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: