巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜
对于巴什博弈可以考虑:n=(m+1)*k+s,即如果n%(m+1)!=0则先取者只需取走s物品即可保证获胜。
HDU 1846:裸的。
#include
#include
#include
#include
#include
typedef long long LL;
using namespace std;
int t,n,m;
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m;
if(n%(m+1))
cout<<"first"<
#include
#include
#include
#include
#include
typedef long long LL;
using namespace std;
int n,m;
int main()
{
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
if((n-1)%2||(m-1)%2)
cout<<"Wonderful!"<
#include
#include
#include
#include
#include
typedef long long LL;
using namespace std;
int n,m;
int num[1100];
int main()
{
while(cin>>n>>m)
{
if(n<=m)
{
for(int i=n;i<=m;i++)
printf(i==m?"%d\n":"%d ",i);
}
else
{
if(n%(m+1)==0)
printf("none\n");
else
printf("%d\n",n%(m+1));
}
}
return 0;
}
威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。奇异局势(必败局势):a=k*(1+sqt(5.0))/2,b=a+k,带入有a=(b-a)*((1+sqt(5.0))/2).
HDU 1527
#include
#include
#include
#include
#include
#include
typedef long long LL;
using namespace std;
int main()
{
int a,b;
double q;
while(cin>>a>>b)
{
if(a>b) swap(a,b);
q=(1+sqrt(5.0))/2;
if(a==(int)((b-a)*q))
cout<<0<
尼姆博奕(Nimm Game:有三堆各若干个物品
,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
,我们用(a,b,c)表示某种局势,首先(0,0,0)显然是奇异局势,无论谁面对奇异局势,都必然失败。第二种奇异局势是(0,n,n),只要与对手拿走一样多的物品,最后都将导致(0,0,0)。仔细分析一下,(1,2,3)也是奇异局势,无论对手如何拿,接下来都可以变为(0,n,n)的情形。
HDU 1850:
#include
#include
#include
#include
#include
#include
typedef long long LL;
using namespace std;
int num[110];
int main()
{
int n,t;
while(cin>>n&&n)
{
t=0;
for(int i=0;i>num[i];
t=(t^num[i]);
}
int cnt=0;
for(int i=0;i