Remainders Game CF687B(数论 判断x%k的值)
2016-07-09 23:22
246 查看
题目链接:http://codeforces.com/problemset/problem/687/B
题意分析:已知 x % ci (1 ≤ ci ≤ n)的值(ci已知,x未知),判断是否能确定x%k的值(k已知)。判断k是否能被所有ci的最小公倍数整除即可。
但要注意不要在求最小公倍数过程中溢出,由于 ci的值很大数量也很多,所以即使用long long也无法避免溢出。只
要在每求得一次最小公倍数后对k取模即可避免这个问题。
题意分析:已知 x % ci (1 ≤ ci ≤ n)的值(ci已知,x未知),判断是否能确定x%k的值(k已知)。判断k是否能被所有ci的最小公倍数整除即可。
但要注意不要在求最小公倍数过程中溢出,由于 ci的值很大数量也很多,所以即使用long long也无法避免溢出。只
要在每求得一次最小公倍数后对k取模即可避免这个问题。
#include<iostream> #include<algorithm> #include<cstring> #include<iomanip> #include<cctype> #include<string> #include<cmath> #include<cstdio> #include<cstdlib> #define LL long long typedef long long ll; using namespace std; const int maxn = 1100; ll gcd(ll a, ll b) { return !b ? a : gcd(b, a % b); } ll lcm(ll a, ll b) { return a / gcd(a, b) * b; } int main() { ll n, k, m; ll ans = 1; bool ok = false; scanf("%I64d%I64d",&n,&k); for(int i = 0; i < n; i++) { scanf("%I64d",&m); ans = lcm(m, ans); ans %= k;//若没有这一步,求最小公倍数时ans可能超过long long 范围 } if(!ans) printf("Yes\n"); else printf("No\n"); return 0; }