题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5708
题意: 一个无限大的棋盘,一开始在1,1,有三种移动方式,(x+1,y)(x,y+1) (x+k,y+k)最后走到nm不能走了的人算输。。
思路。。我们看成一开始在(n,m),往1,1,走,所以自然可以从1,1,开始递推往出,那么打表程序就出来了。。
打出表以后我们观察到k等于1时稍有特殊,其他则与 (min(cx,cy)&1)^((n+m)&1)) 有关ps(其中cx=n/(k+1),cy=m/(k+1))
那么就愉快的分类讨论外加试一试和表对照一下就好了。。
PS:找规律真神奇?
代码:
#include <iostream>
using namespace std;
int n,m,k,q;
void pt(int x){
if(x==1) cout<<"Alice"<<endl;
else cout<<"Bob"<<endl;
}
int main(){
int t;
cin>>t;
while(t--){
cin>>q>>k;
while(q--){
cin>>n>>m;
int cx=n/(k+1),cy=m/(k+1);
int yx=n%(k+1),yy=m%(k+1);
if(k==1){
if((yx==0&&m>=n)||(yy==0&&n>=m)) pt(1);
else pt((0^((n+m)&1)));
}
else{
if((yx==0&&m>=n)||(yy==0&&n>=m)) pt(1);
else pt((0^(min(cx,cy)&1)^((n+m)&1)));
}
}
}
return 0;
}