/*
题目描述:给出n个数c1 , c2 , ... , cn ,以及一个正整数k(所有数都是<=1e6的正整数)问是否对于任意的x,只要知道了
x%c1 , x%c2 , ... ,x%cn的值,就一定能确定x%k的值
思路:首先根据模线性方程组的求解过程可知,若已知x%c1 , x%c2 , ... ,x%cn的值,便可知x % M的值,其中M是c1,c2,...
cn的最小公倍数,当且仅当k是M的因子时,对于任意的x可以确定x%k的值,所以问题就成了M是否含有因子k
判断的方法可以是记录已经可以消掉的k中的因子的乘积d,每次取k与c[i]之间的最大公约数GCD,那么GCD/gcd(GCD,d)便是
c[i]可以贡献出的消掉的k中的因子,最终判断消掉的因子乘积d是否等于k就可以
*/
#pragma warning(disable:4786)
#pragma comment(linker, "/STACK:102400000,102400000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<cmath>
#include<string>
#include<sstream>
#define LL __int64
#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define lson l,m,x<<1
#define rson m+1,r,x<<1|1
using namespace std;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const double PI = acos(-1.0);
const double eps=1e-6;
const int maxn = 1e6 + 5;
inline LL gcd(LL a , LL b)
{
return b == 0 ? a : gcd(b , a % b);
}
LL c[maxn];
int main()
{
int n ;
LL k;
scanf("%d%I64d",&n , &k);
for(int i = 1 ; i<= n ; i++){
scanf("%I64d",&c[i]);
}
LL d = 1LL , GCD;
for(int i = 1 ; i<= n ; i++){
GCD = gcd(c[i] , k);
GCD = GCD / gcd(GCD , d);
d *= GCD;
}
if(d == k)
puts("Yes");
else
puts("No");
return 0;
}
codeforces round 360 div2 Remainders Game gcd+模线性方程组
最新推荐文章于 2017-05-20 17:34:24 发布