思路:求最大公约数,如果是1,只要看是否有一个为快乐的,有则yes否则no,如果大于1,则看每个长度为t(最大公约数)(b和g可以分为好多个长度为t的区间)的区间中每个对应位置至少有一个是快乐的
AC代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int gcd(int a, int b) {
if(a > b) return gcd(b, a);
if(b % a == 0) return a;
return gcd(b % a, a);
}
int main() {
int a[105], c[105], tmp[105];
int n, m, b, g, t, x;
while(scanf("%d %d", &n, &m) != EOF) {
memset(a, 0, sizeof(a));
memset(c, 0, sizeof(c));
memset(tmp, 0, sizeof(tmp));
scanf("%d", &b);
for(int i = 0; i < b; i++) {
scanf("%d", &x); a[x] = 1;
}
scanf("%d", &g);
for(int i = 0; i < g; i++) {
scanf("%d", &x); c[x] = 1;
}
if(gcd(n, m) == 1) {
if(b + g >= 1) printf("Yes\n");
else printf("No\n");
continue;
}
if((t = gcd(n, m)) != 1){
for(int i = 0; i < n; i++)
if(a[i]) tmp[i%t] = 1;
for(int i = 0; i < m; i++)
if(c[i]) tmp[i%t] = 1;
}
int cnt = 0;
for(int i = 0; i < t; i++) if(tmp[i]) cnt++;
if(cnt == t) printf("Yes\n");
else printf("No\n");
}
return 0;
}