首页 > 代码库 > Codeforces 688D Remainders Game 数学

Codeforces 688D Remainders Game 数学

题意:Pari选了两个数x,k,已知k和n个数c[i],也能"知道"x%c[i],问是否x%k的值是否唯一?
n,k,c[i]<=1e6

假如存在x1,x2满足:x1和x2同余c[i](i=1..n),但是x1%k!=x2%k 则此时不能确定x%k的值,答案为no
即(x1-x2)%c[i]==0 因为lcm(c[1]..c[n])|(x1-x2)
k不整除(x1-x2) k也不整除lcm(c[1]..c[n]) 该条件为必要条件.
证明充分性很简单 构造x1=2*lcm,x2=lcm即可.
注意:求lcm时容易溢出,改为判断gcd(lcm,k)是否等于k.

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e6+20;
ll n,c[N];
ll gcd(ll a,ll b)
{
    return b==0?a:gcd(b,a%b);
}
ll lcm(ll a,ll b)
{
    return a*b/gcd(a,b);
}
int main()
{
    ll n,k,x;
    cin>>n>>k;
    ll res=1;
    for(int i=1;i<=n;i++)
    {
        scanf("%I64d",&x);
        res=gcd(k,lcm(res,x));
    }
//    cout<<res<<endl;
    if(res!=k)
        puts("No");
    else
        puts("Yes");
    
    return 0;
}

 

Codeforces 688D Remainders Game 数学