Codeforces Round #360 (Div. 2) -- D. Remainders Game (中国剩余定理)

来源:互联网 发布:网络名人周小平 编辑:程序博客网 时间:2024/04/29 12:37
D. Remainders Game
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Today Pari and Arya are playing a game called Remainders.

Pari chooses two positive integer x andk, and tells Aryak but notx. Arya have to find the value. There aren ancient numbers c1, c2, ..., cn and Pari has to tell Arya if Arya wants. Givenk and the ancient values, tell us if Arya has a winning strategy independent of value ofx or not. Formally, is it true that Arya can understand the value for any positive integerx?

Note, that means the remainder ofx after dividing it by y.

Input

The first line of the input contains two integers n andk (1 ≤ n, k ≤ 1 000 000) — the number of ancient integers and valuek that is chosen by Pari.

The second line contains n integers c1, c2, ..., cn (1 ≤ ci ≤ 1 000 000).

Output

Print "Yes" (without quotes) if Arya has a winning strategy independent of value ofx, or "No" (without quotes) otherwise.

Examples
Input
4 52 3 5 12
Output
Yes
Input
2 72 3
Output
No
Note

In the first sample, Arya can understand because5 is one of the ancient numbers.

In the second sample, Arya can't be sure what is. For example1 and 7 have the same remainders after dividing by2 and3, but they differ in remainders after dividing by7.

重新修正下这篇博客!因学长的教训,重新思考了这个问题!

大体题意:

告诉你k 但不告诉你x 并且告诉你n个ci来,你也知道x%ci,想让你求出x mod k来!问是否有唯一解!

思路:

反证法,假设解不唯一,有x1,x2,那么x1,x2满足:

x1 % ci == x2 % ci 并且x1 % k != x2 % k,所以 (x1 - x2) % ci == 0 ,(x1-x2) % k != 0

并且lcm(c1,c2,,,,cn) % ci == 0

,所以lcm % (x1-x2) == 0.

且   (x1-x2) % k != 0;

所以lcm % k != 0 

所以命题: 如果解不唯一,那么lcm % k != 0

逆否命题为:  若lcm % k == 0 那么 解唯一!

所以只需要判断lcm是否k 的整数倍,

也就是说这个问题可以转换为:

是否存在x使得  x是c1,c2,c3,,,cn,k的整数倍!

是的话就是yes,否则就是no!



#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;ll gcd(ll a,ll b){    return !b ? a : gcd(b,a%b);}ll lcm(ll a,ll b){    return a*b/gcd(a,b);}int main(){//    printf("%d\n",gcd(6,13));    int n;    ll k;    scanf("%d%I64d",&n,&k);    ll ans = 1;    bool ok = false;    for (int i = 0; i < n; ++i){        ll x;        scanf("%I64d",&x);        if (ans)        ans = lcm(ans,x) % k;        if (ans == 0)ok=true;    }    if (ok)printf("Yes\n");    else printf("No\n");    return 0;}


0 0