a % m只有m种可能,若某个余数是之前出现过的,那么接下来的余数一定会陷入循环,故生产不会停止。由于只要出现0便会停止,由鸽巢原理,m次操作里面没有出现0的话,则第m次一定会得到1 ~ m - 1之间的数,则进入循环。所以只需检测m次操作中是否出现0即可
代码如下:
#include <cstdio>
using namespace std;
int main(){
long long a;
int m;
bool stop = false;
scanf("%I64d %d", &a, &m);
for(int i = 0;i < m; i ++){
int tmp = a % m;
if(tmp == 0){
stop = true;
break;
}
a += tmp;
}
if(stop)
printf("Yes\n");
else
printf("No\n");
return 0;
}