只是套模板而已(模板其实也不懂)。
留着以后好好学的时候再改吧。
题意——
X = a[i] MOD b[i];
已知a[i],b[i],求在[1, n]中存在多少x满足条件。
输入——
第一行一个整数t,表示一共t组数据。
第二行两个整数n,m,表示在n以内寻找满足的数,一共m组方程组。
输出——
一个整数。如果存在满足的x,则输出x的数量。否则输出0。
直接给代码吧——
1 #include <cstdio> 2 #include <iostream> 3 #include <cmath> 4 #include <cstring> 5 #include <algorithm> 6 #define LL long long 7 using namespace std; 8 9 const int N = 15; 10 11 int a[N], b[N]; 12 int m; 13 int n, m1, r1, x, y, d; 14 int m2, r2, c, t, mod; 15 bool flag; 16 17 void exgcd(int a, int b, int &x, int &y, int &d) 18 { 19 if(!b) 20 { 21 d = a; 22 x = 1; 23 y = 0; 24 } 25 else 26 { 27 exgcd(b, a%b, y, x, d); 28 y -= x*(a/b); 29 } 30 } 31 32 void crt() 33 { 34 m1 = a[0], r1 = b[0]; 35 flag = 0; 36 for(int i = 1; i < m; i++) 37 { 38 m2 = a[i]; 39 r2 = b[i]; 40 if(flag) continue; 41 exgcd(m1, m2, x, y, d); 42 c = r2-r1; 43 if(c%d) 44 { 45 flag = 1; 46 continue; 47 } 48 mod = m2/d; 49 x = (c/d*x%mod+mod)%mod; 50 r1 = m1*x+r1; 51 m1 = m1*m2/d; 52 } 53 if(flag || n < r1) printf("0 "); 54 else 55 { 56 int ans = (n-r1)/m1+1; 57 if(r1 == 0) ans--; 58 printf("%d ", ans); 59 } 60 } 61 62 int main() 63 { 64 //freopen("test.txt", "r", stdin); 65 scanf("%d", &t); 66 while(t--) 67 { 68 scanf("%d%d", &n, &m); 69 for(int i = 0; i < m; i++) scanf("%d", &a[i]); 70 for(int i = 0; i < m; i++) scanf("%d", &b[i]); 71 crt(); 72 } 73 return 0; 74 }