//题目:有n个石子 两个人交替取石子 第一次取一个 以后每一次取的石子不超过前一个的二倍 先去完的胜利
#include<iostream>
using namespace std;
int main()
{
int l[100][100];//l[i][j]表示剩余n个石子 这一次最多取j个 因为是最多取j个 所以要用k列举1~j的所有情况
int i,j,k,flag,n;
cin>>n;
l[1][1]=1;
for(i=2;i<=n;i++)
{
for(j=1;j<i;j++)//j一定要小于i 因为j>=i的话一次就ok了 没有意义了
{ //计算l[i][j]
flag=0;//先立个flag 如果找到了上一步为0 flag变成1 否则flag还是0
for(k=1;k<=j;k++)//开始列举l[i][1~j]的所有情况
{
if(2*k>=i-k)//如果我取了之后对方 一次没错一次就取完了 涉及到的是没有计算的l[i][j] 那么我就失败了
{
break;
}
if(l[i-k][2*k]==0)//如果找到了上一步为0的情况那么我就胜利了
//很多人包括我会疑惑为什么一步就判断出来了 也就是为什么[2*k]会这么神奇 没错它就是这么神奇
//因为对方足够聪明 如果最大的k还不能取到1 那么他就失败了
//按照该算法 每次都会列举一下 尽可能的使flag=1
{
flag=1;
break;
}
}
l[i][j]=flag;
}
}
cout<<l[n][1]<<endl;
return 23;
}
#include<iostream>
using namespace std;
int main()
{
int l[100][100];//l[i][j]表示剩余n个石子 这一次最多取j个 因为是最多取j个 所以要用k列举1~j的所有情况
int i,j,k,flag,n;
cin>>n;
l[1][1]=1;
for(i=2;i<=n;i++)
{
for(j=1;j<i;j++)//j一定要小于i 因为j>=i的话一次就ok了 没有意义了
{ //计算l[i][j]
flag=0;//先立个flag 如果找到了上一步为0 flag变成1 否则flag还是0
for(k=1;k<=j;k++)//开始列举l[i][1~j]的所有情况
{
if(2*k>=i-k)//如果我取了之后对方 一次没错一次就取完了 涉及到的是没有计算的l[i][j] 那么我就失败了
{
break;
}
if(l[i-k][2*k]==0)//如果找到了上一步为0的情况那么我就胜利了
//很多人包括我会疑惑为什么一步就判断出来了 也就是为什么[2*k]会这么神奇 没错它就是这么神奇
//因为对方足够聪明 如果最大的k还不能取到1 那么他就失败了
//按照该算法 每次都会列举一下 尽可能的使flag=1
{
flag=1;
break;
}
}
l[i][j]=flag;
}
}
cout<<l[n][1]<<endl;
return 23;
}