CodeForces 687B - Remainders Game(中国剩余定理)
2016-07-06 08:54
441 查看
题意:给定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
#include<cstdio> #include<cstring> #include<cctype> #include<cstdlib> #include<cmath> #include<iostream> #include<sstream> #include<iterator> #include<algorithm> #include<string> #include<vector> #include<set> #include<map> #include<deque> #include<queue> #include<stack> #include<list> typedef long long ll; typedef unsigned long long llu; const int MAXN = 100 + 10; const int MAXT = 1000000 + 10; const int INF = 0x7f7f7f7f; const double pi = acos(-1.0); const double EPS = 1e-6; using namespace std; int n; llu k, a[MAXT]; llu gcd(llu a, llu b){ return b == 0 ? a : gcd(b, a % b); } llu lcm(llu a, llu b){ return a * b / gcd(a, b); } int main(){ scanf("%d%I64u", &n, &k); for(int i = 0; i < n; ++i) scanf("%I64u", a + i); llu tmp = 1; for(int i = 0; i < n; ++i){ tmp = lcm(tmp, a[i]); tmp %= k; //防止爆llu类型 } if(tmp % k == 0) printf("Yes\n"); else printf("No\n"); return 0; }
相关文章推荐
- 1.m分解阶乘之和
- 2.几种递推数
- 3.欧拉函数
- 4.快速幂模m算法
- 5.扩展欧几里得&&中国剩余定理
- 6.数论_web
- Project Euler Problem 387 - Harshad Numbers - 深度优先
- 编程之美2015初赛A
- Codeforces Round #197 (Div. 2)
- Codeforces Round #198 (Div. 1)
- Codeforces 405E Codeforces Round #238 (Div. 2)E
- Codeforces 407C Codeforces Round #239 (Div. 1)C
- CodeForces 449A - Jzzhu and Chocolate
- CodeForces 449 B. Jzzhu and Cities
- codeforces 618C. Constellation
- Codeforces Round #349 (Div. 2) - C
- Codeforces Round #265 (Div. 2)
- 数论题集
- Codeforces #310 div2 C. Case of Matryoshkas
- 状态压缩DP codeforces 244 Problem C. The Brand New Function 和 codeforces 165 E. Compatible Numbers