思路:
暴力果然超时。
根据最后一次选取,易得 ans%(k+1) == 1 || ans%(k+1) == 0
检验时,因为题目只要求不选好人,不要求具体排位,所以只需要分别记录好人坏人的个数。显然,好人永远为k。
对于每次选取,若是坏人,坏人数减减;若是好人,则说明不可行。如此这般,直到坏人尽绝。
以及选取时需求余。
#include <cstdio>
#include <cstring>
const int MAXK = 13;
int f[MAXK+1];
bool is_right(int k, int m)
{
int bad = k;
int p = 1;
while (bad)
{
p = (p + m - 1) % (k + bad);
if (!p) p = k + bad;
if (p > k) bad--;
else return false;
}
return true;
}
int main()
{
for (int i = 1; i <= MAXK; i++)
{
for (int ans = i+1;; ans += i+1)
{
if (is_right(i, ans))
{
f[i] = ans;
break;
}
if (is_right(i,ans+1))
{
f[i] = ans+1;
break;
}
}
}
int k;
while (scanf("%d", &k) != EOF && k) printf("%d\n", f[k]);
return 0;
}