这个题目想了很久,也还是没有什么思路。后来看了别人的想法,自己实现了一下。题目的意思是已知k和ci,问你如果给出了x%ci,是不是就能确定x%k。这个题目,个人觉得这篇博客讲的比较清楚。 http://www.cnblogs.com/shuguangzw/p/5629564.html。
以下是我自己的实现的,主要是判断ci的最小公倍数是不是k的倍数。判断思路如下:将k分解p1^x1*p2^x2....,其中pi为质数。然后对每一个pi,判断是不是存在一个ci中含有大于xi个pi。最后,如果成立,即可以。否则,不行!
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAX = 1000010;
int a[MAX], b[MAX];
struct Node{
int u, v;
}p[10000];
int main(){
memset(a, 0, sizeof(a));
int c = 0;
for (int i = 2; i<MAX; i++) if (a[i] == 0){
b[c++] = i;
for (int j = 2*i ; j<MAX; j+=i){
a[j] = 1;
}
}
int n,k;
while (scanf("%d%d",&n,&k) != EOF){
for (int i = 0; i<n; i++){
scanf("%d",&a[i]);
}
int cnt = 0;
memset(p, 0, sizeof(p));
for (int i = 0; i<c; i++){
if (k == 1) break;
if (k % b[i] == 0){
p[cnt].u = b[i];
while (k%b[i] == 0){
k = k / b[i];
p[cnt].v++;
}
cnt++;
}
}
/* for (int i = 0; i<cnt; i++){
printf("%d %d\n",p[i].u, p[i].v);
}*/
for (int i = 0; i<cnt; i++){
int tmp = 0;
for (int j = 0; j<n; j++){
if (a[j] % p[i].u == 0){
int ttt = 0;
while (a[j]>1 && a[j]%p[i].u==0){
ttt++;
a[j] = a[j] / p[i].u;
}
tmp = max(tmp, ttt);
}
}
if (tmp >= p[i].v) p[i].v = 0;
}
int mark = 0;
for (int i = 0; i<cnt; i++) if (p[i].v>0) mark = 1;
if (mark) printf("No\n");
else printf("Yes\n");
}
return 0;
}