题意:
给出公式next = (next + step) % mod中的step和mod,问能不能在恰好mod步之内生成0~mod-1中所有的数字。
另外,有人说可以不用模拟,直接判断step和mod这两个数是否互质就可以了(即最大公约数是否等于1),是则Good Choice,反之就是Bad Choice,暂时没有了解它的原理,也许是自己的数论基础不够好吧。
代码如下(15MS,1896K):
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstring>
using namespace std;
const int maxn(100001);
bool isGenerated[maxn];
int step, mod;
void printFormat(bool flag) {
cout << setw(10) << step << setw(10) << mod << " ";
cout << (flag ? "Good Choice" : "Bad Choice");
cout << endl << endl;
}
bool iterate() {
for (int start = 0; start <= step - 1; ++start) {
memset(isGenerated, false, sizeof isGenerated);
isGenerated[start] = true;
int needTurn = mod - 1, next = start;
while (needTurn--) {
next = (next + step) % mod;
if (isGenerated[next]) {
break;
} else {
isGenerated[next] = true;
}
}
if (needTurn == -1) {
return true;
}
}
return false;
}
int main() {
while (cin >> step >> mod) {
bool resultFlag = iterate();
printFormat(resultFlag);
}
return 0;
}