HDOJ 的 Uniform Generator 題目要求判斷一個線性同餘生成器產生的序列是否能覆蓋 0 到 mod-1 的所有整數。若能覆蓋則為 "Good Choice",否則為 "Bad Choice"。這類問題常見於隨機數生成器的週期性分析。
採用「打表 + 排序 + 比較」的策略:
list 作為基準。radom[i] = (radom[i-1] + step) % mod 生成序列。qsort)。#include <iostream>
#include <iomanip>
#include <cstring>
#include <cstdlib>
using namespace std;
const int maxn = 100000;
int list[maxn], radom[maxn];
void Makelist() {
for (int i = 0; i < maxn; i++) list[i] = i;
}
int cmp(const void *a, const void *b) {
return *(int *)a - *(int *)b;
}
int main() {
int step, mod;
Makelist();
while (cin >> step >> mod) {
int flag = 1;
memset(radom, 0, sizeof(radom));
radom[0] = 0;
for (int i = 1; i < mod; i++)
radom[i] = (radom[i-1] + step) % mod;
qsort(radom, mod, sizeof(int), cmp);
for (int i = 0; i < mod; i++) {
if (list[i] != radom[i]) {
flag = 0;
break;
}
}
cout << setw(10) << step << setw(10) << mod << " "
<< (flag ? "Good Choice" : "Bad Choice") << endl << endl;
}
return 0;
}
注意 qsort 的第三個參數應為 sizeof(int) 而非 sizeof(mod),否則會導致排序錯誤。此外,輸出格式需嚴格遵循 setw(10) 對齊,並在每組結果後輸出空行。