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

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 Arya k but notx. Arya have to find the value . There are n 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 value k 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 5
2 3 5 12
Output
Yes
Input
2 7
2 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 and 3, 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值