hdu 1573 x问题(中国剩余定理)HDU 2007-1 Programming Contest

时间:2024-07-07 16:34:20

只是套模板而已(模板其实也不懂)。

留着以后好好学的时候再改吧。

题意——

X = a[i] MOD b[i];

已知a[i],b[i],求在[1, n]中存在多少x满足条件。

输入——

第一行一个整数t,表示一共t组数据。

第二行两个整数n,m,表示在n以内寻找满足的数,一共m组方程组。

输出——

一个整数。如果存在满足的x,则输出x的数量。否则输出0。

直接给代码吧——

 #include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#define LL long long
using namespace std; const int N = ; int a[N], b[N];
int m;
int n, m1, r1, x, y, d;
int m2, r2, c, t, mod;
bool flag; void exgcd(int a, int b, int &x, int &y, int &d)
{
if(!b)
{
d = a;
x = ;
y = ;
}
else
{
exgcd(b, a%b, y, x, d);
y -= x*(a/b);
}
} void crt()
{
m1 = a[], r1 = b[];
flag = ;
for(int i = ; i < m; i++)
{
m2 = a[i];
r2 = b[i];
if(flag) continue;
exgcd(m1, m2, x, y, d);
c = r2-r1;
if(c%d)
{
flag = ;
continue;
}
mod = m2/d;
x = (c/d*x%mod+mod)%mod;
r1 = m1*x+r1;
m1 = m1*m2/d;
}
if(flag || n < r1) printf("0\n");
else
{
int ans = (n-r1)/m1+;
if(r1 == ) ans--;
printf("%d\n", ans);
}
} int main()
{
//freopen("test.txt", "r", stdin);
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &m);
for(int i = ; i < m; i++) scanf("%d", &a[i]);
for(int i = ; i < m; i++) scanf("%d", &b[i]);
crt();
}
return ;
}