题目大意:
b个男生,g个女生,其中有bnum个男生是开心的,gnum个女生是开心的。
在第i 天第i mod b个男生会和第i mod g个女生一起吃饭,如果两人中有一个是开心的,两个人从那一天其几都会是开心的。
问能否使全部人开心?
结题思路:
首先可以知道,如果i一直增加下去,有一些组合是怎么都不可能全部开心的,而可以全部开心的组合,应该会有一个i 的最小上界。
这道题最主要的就是确定最小上界的问题,当然可以简单粗暴的100*100,复杂度也不高应该可以直接过
但是想得更细致一点,其实可以化作是一下两个序列的比对:
b 010101010 101010101
g 012345678 012345678…..
这个问题和max(n,m)mod min(n,m)的值有关。而如其值为1,此时要比对次数最多,就取得全部人开心的i的最小上界,既是2*n*m。因为此时第三个n*m是没有必要的,因为第三个n*m是第一个重复。
以下是代码:
#include "stdio.h"
#include "stdlib.h"
#include "iostream"
#include "math.h"
#include "memory.h"
using namespace std;
int n,m;
int bnum,gnum;
bool b[108];
bool g[108];
int main()
{
memset(b,false,sizeof b);
memset(g,false,sizeof g);
scanf("%d %d",&n,&m);
scanf("%d",&bnum);
int tmp;
for(int i=0;i<bnum;i+=1){
scanf("%d",&tmp);
b[tmp]=true;
}
scanf("%d",&gnum);
for(int i=0;i<gnum;i+=1){
scanf("%d",&tmp);
g[tmp]=true;
}
for(int i=0;i<2*n*m;i+=1){ //关键是这个地方
if(b[i%n]||g[i%m]){
b[i%n]=true;
g[i%m]=true;
}
}
bool flag=true;
for(int i=0;i<n;i+=1){
if(!b[i]){flag=false;break;}
}
for(int i=0;flag&&i<m;i+=1){
if(!g[i]){flag=false;break;}
}
if(flag) printf("Yes\n");
else printf("No\n");
return 0;
}