这两道题没什么好说的只能佩服发明这些东西的大佬实在是太厉害;Nim积就是关于x和y的新行算法 我就不多说什么了实在是因为太笨只能记住公式:
附加:(Nim积相关资料来自论文曹钦翔《从“k倍动态减法游戏”出发探究一类组合游戏问题》)
HDU:3404
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
#define clr(a,b) memset(a,b,sizeof(a))
typedef long long ll;
const int maxn=10000+4;
const int minn=100+5;
int n,sg[2][2]={0,0,0,1};
int Nim_Multi_Power(int x,int y)
{
if(x<2)
return sg[x][y];
int a=0;
for(;;a++)
if(x>=(1<<(1<<a))&&x<(1<<(1<<(a+1))))
break;
int m=1<<(1<<a);
int p=x/m,s=y/m,t=y%m;
int d1=Nim_Multi_Power(p,s);
int d2=Nim_Multi_Power(p,t);
return (m*(d1^d2))^Nim_Multi_Power(m/2,d1);
}
int Nim_Multi(int x,int y)
{
if(x<y)
return Nim_Multi(y,x);
if(x<2)
return sg[x][y];
int a=0;
for(;;a++)
if(x>=(1<<(1<<a))&&x<(1<<(1<<(a+1))))
break;
int m=1<<(1<<a);
int p=x/m,q=x%m,s=y/m,t=y%m;
int c1=Nim_Multi(p,s);
int c2=Nim_Multi(p,t)^Nim_Multi(q,s);
int c3=Nim_Multi(q,t);
return (m*(c1^c2))^c3^Nim_Multi_Power(m/2,c1);
}
int main()
{
int t;scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int ans=0,x,y;
for(int i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
ans^=Nim_Multi(x,y);
}
if(ans){printf("Have a try, lxhgww.\n");}
else {printf("Don't waste your time.\n");}
}
return 0;
}
POJ:3533
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define clr(a,b) memset(a,b,sizeof(a))
typedef long long ll;
int n,sg[2][2]= {0,0,0,1};
int Nim_Multi_Power(int x,int y)
{
if(x<2)
{
return sg[x][y];
}
int a=0;
for(;; a++)
if(x>=(1<<(1<<a))&&x<(1<<(1<<(a+1))))
{
break;
}
int m=1<<(1<<a);
int p=x/m,s=y/m,t=y%m;
int d1=Nim_Multi_Power(p,s);
int d2=Nim_Multi_Power(p,t);
return ((d1^d2)*m)^Nim_Multi_Power(m/2,d1);
}
int Nim_Multi(int x,int y)//计算函数
{
if(x<y)
{
return Nim_Multi(y,x);
}
if(x<2)
return sg[x][y];
int a=0;
for(;; a++)
if(x>=(1<<(1<<a))&&x<(1<<(1<<(a+1))))
{
break;
}
int m=1<<(1<<a);
int p=x/m,q=x%m,s=y/m,t=y%m;
int c1=Nim_Multi(p,s);
int c2=Nim_Multi(p,t)^Nim_Multi(q,s);
int c3=Nim_Multi(q,t);
return (c1^c2)*m^c3^Nim_Multi_Power(m/2,c1);
}
int Nim_Multi1(int x,int y,int z)
{
return Nim_Multi(Nim_Multi(x,y),z);
}
int main()
{
while(~scanf("%d",&n))
{
int ans=0,x,y,z;
while(n--)
{
scanf("%d%d%d",&x,&y,&z);
ans^=Nim_Multi1(x,y,z);
}
if(ans)
{
printf("No\n");
}
else
{
printf("Yes\n");
}
}
return 0;
}