题目描述
传送门
题目大意:
给出n个数ci,我们知道x%ci的值,能不能确定出x%k的值。
题解
虽说给的tag是扩展中国剩余定理,但是没有真的需要写扩展中国剩余定理。
如果两个数x,y在%ci意义下都相同,那么
x=y+lcm(ci)∗t(t>0)
如果要唯一确定
x%k
的值,那么对于t的任意取值满足
(x+lcm(ci)∗t)%k=x%k
也就是判断lcm(ci)是否是k的倍数。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
int n,k;
LL gcd(LL x,LL y)
{
LL r;
while (y){
r=x%y;
x=y; y=r;
}
return x;
}
int main()
{
freopen("a.in","r",stdin);
scanf("%d%d",&n,&k);
LL lcm=1;
for (int i=1;i<=n;i++) {
LL c; scanf("%I64d",&c);
//cout<<lcm<<" "<<c<<endl;
lcm=lcm*c/gcd(lcm,c)%k;
}
//cout<<lcm<<endl;
if (lcm) printf("No\n");
else printf("Yes\n");
}