人人尽说江南好
传送门:[HEOI2014]人人尽说江南好
先放词:
菩萨蛮 韦庄
人人尽说江南好,游子只合江南老,青水碧于天,画船听雨眠。
垆边人似月,皓腕凝霜雪,未老莫还乡,还乡须断肠。
题目分析:
第一眼看上去,貌似很难
但是如果再仔细看一下,就会发现…
还是很难
不过只要你认真思考这个题,你就会发现…
已经过去半个小时了,还是一点头绪都没有
首先我们要知道一个道理:
如果再一局中操作偶数次后无法操作,则先手获胜。反之,后手获胜。
在无法操作时,场上的局面一定是 m , m , m ⋅ ⋅ ⋅ m , ( n % m ) m,m,m···m,(n\%m) m,m,m⋅⋅⋅m,(n%m)
有 n ÷ m n÷m n÷m 堆 “ m m m ”
当 n % m = 0 n\%m=0 n%m=0 时,共有 n ÷ m n÷m n÷m 堆,操作了 n − n ÷ m n-n÷m n−n÷m 次
当 n % m ≠ 0 n\%m≠0 n%m=0 时,共有 n ÷ m + 1 n÷m+1 n÷m+1 堆,操作了 n − ( n ÷ m + 1 ) n-(n÷m+1) n−(n÷m+1) 次
判断次数奇偶即可
特殊情况: 当 m = = 1 m==1 m==1 时,后手获胜
Code:
#include<bits/stdc++.h>
using namespace std;
inline int Read(){
int dx=0,fh=1;
char c=getchar();
while(c>'9'||c<'0'){
if(c=='-') fh=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
dx=dx*10+c-'0';
c=getchar();
}
return dx*fh;
}
int m,n,T;
int main(){
T=Read();
while(--T>=0){
n=Read(),m=Read();
if(m==1) printf("1\n");
else if(n%m) printf("%d\n",((n-n/m)%2));
else printf("%d\n",((n-n/m-1)%2));
}
return 0;
}
反思与总结:
- 要分析题中的特殊情况
- 通过分析最初的局面与最后的局面来分析步数