CodeForces 687B - Remainders Game(中国剩余定理)

题意:给定n个数(a1,a2,a3…… )和k,对于未知数x,假如你已知x mod ai(1 <= i <= n),能否求出x mod k的值?

中国剩余定理:

若m1,m2,m3……mn两两互质,有方程组

       k ≡ a1(mod m1)

       k ≡ a2(mod m2)

       k ≡ a3(mod m3)

       ……

       k ≡ an(mod mn)

则能求出解k。

在此题中:已知的n个数即是以上的m1~mn,而以上的a1~an均为此题中的x,

根据中国剩余定理可得:若这n个数的最小公倍数是k的倍数,则能求出x mod k

 

 1 #include<cstdio>  
 2 #include<cstring>  
 3 #include<cctype>  
 4 #include<cstdlib>  
 5 #include<cmath>  
 6 #include<iostream>  
 7 #include<sstream>  
 8 #include<iterator>  
 9 #include<algorithm>  
10 #include<string>  
11 #include<vector>  
12 #include<set>  
13 #include<map>  
14 #include<deque>  
15 #include<queue>  
16 #include<stack>  
17 #include<list>  
18 typedef long long ll;  
19 typedef unsigned long long llu;  
20 const int MAXN = 100 + 10;  
21 const int MAXT = 1000000 + 10;  
22 const int INF = 0x7f7f7f7f;  
23 const double pi = acos(-1.0);  
24 const double EPS = 1e-6;  
25 using namespace std;  
26   
27 int n;  
28 llu k, a[MAXT];  
29   
30 llu gcd(llu a, llu b){  
31     return b == 0 ? a : gcd(b, a % b);  
32 }  
33   
34 llu lcm(llu a, llu b){  
35     return a * b / gcd(a, b);  
36 }  
37   
38 int main(){  
39     scanf("%d%I64u", &n, &k);  
40     for(int i = 0; i < n; ++i)  scanf("%I64u", a + i);  
41     llu tmp = 1;  
42     for(int i = 0; i < n; ++i){  
43         tmp = lcm(tmp, a[i]);  
44         tmp %= k;   //防止爆llu类型  
45     }  
46     if(tmp % k == 0)  printf("Yes\n");  
47     else  printf("No\n");  
48     return 0;  
49 }  

 

posted @ 2016-10-25 11:06  TianTengtt  阅读(169)  评论(0编辑  收藏  举报