您的位置:首页 > 其它

hdu 1573 X问题(一元线性同余方程组)

2017-11-11 19:28 525 查看
当中国剩余定理中的那些模数不互质的时候怎么解?就像解普通方程组一样,迭代求解同余方程组。思路很简单。过两天重新写个,换掉这个抄来的模板。

可以看这里的讲解:http://972169909-qq-com.iteye.com/blog/1266328

《初等数论及其应用》(原书第六版)119页也有个例子。

代码是直接拿的模板,改都没改

http://blog.csdn.net/discreeter/article/details/70318677

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int N = 110, INF = 0x3f3f3f3f;

int M
, R
;

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