poj2368:点击打开链接
写个简单的题……巴什博弈的扩展,输入石子数n,要求使后手能赢的最小的m值,其实就是找n % (m + 1) == 0的m的最小值,可以通过找n的因子,选择一个最小的减一即可。注意找因子的时间,没排序前a数组的前两个数是1和n,如果n是素数,那么答案就是n - 1,如果不是素数,那么就要排序,找出了1意外的n的最小因子。
#include <stdio.h>
#include <algorithm>
using namespace std;
int a[10010];
int main (void)
{
int n;
while(scanf("%d", &n) != EOF)
{
int i;
bool f = 0;
int k = 0;
for(i = 1; i * i <= n; i++)
{//i从1开始,如果n是素数,那么答案就是n - 1
if(n % i == 0)
{
a[k ++] = i;
a[k ++] = n / i;
}
}
sort(a, a + k);//将因子从小到大排序
for(i = 0; i < k; i++)
printf("%d ", a[i]);
printf("\n");
for(i = 0; i < k; i++)
{
if(a[i] > 2)
{
printf("%d\n", a[i] - 1);
f = 1;
break;
}
}
if(f == 0)
printf("0\n");
}
return 0;
}