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

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

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

题意——

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 }
View Code
原文地址:https://www.cnblogs.com/mypride/p/4676252.html