基础的巴什博奕
巴什博奕的重点是只有一堆,
如果n % (m + 1) != 0 则先手赢,如果用普通的数组会TLE。
证明:如果n = m + 1,先手最多拿m个,肯定有剩下的,所以先手必输,所以碰到k(m + 1)的局面的人必输。
那么如果n = k(m + 1) + s,这个k 就是系数,s < m + 1,那么只要先手拿掉s个,这样后手面对的就是k(m + 1)局面,所以先手在
n % (m + 1) != 0时必输。
#include <iostream>
using namespace std;
int a[1000001];
int main(){
int t,n,m;
cin>>t;
while(t--){
cin>>n>>m;
if(n % (m + 1) != 0){
cout<<"Win"<<endl;
}else{
cout<<"Lose"<<endl;
}
}
return 0;
}
这题是尼姆博弈和巴什博奕的结合
每一堆是巴什博奕,如果巴什博奕赢了就看成是石子数为1的堆,如果输了就看成是石子数为0的堆(看做没有了),下面面对的就是尼姆博弈,如果1的堆数是2的倍数,就相当于尼姆博弈中的奇异局势,面对这种局势必输,如果石子数为1的堆数不是2的倍数,那么是非奇异局势,必赢。
#include <iostream>
using namespace std;
int main(){
int N,a,b;
int T;
cin>>T;
while(T--){
cin>>N;
int ans = 0;
for(int i = 0; i < N; i++){
cin>>a>>b;
ans ^= (a % (b + 1));
}
if(ans) cout<<"Win"<<endl;
else cout<<"Lose"<<endl;
}
return 0;
}
真是看了半天,好多帖子都没讲清楚的感觉,男人八题之一,看上去就非常吓人,但是代码真的很简洁,有点像尼姆博弈。
但是不一样,我们可以分析,
假如有一堆石子,先手必赢(N局势),
假如有两堆石子,如果两堆的数量一样,先手必输(P局势),如果两堆数量不一样,N局势,
假如有三堆石子,先手必赢(N局势)
假如有四堆石子,如果石子数量量相同,P,如果不相同,N。
以此类推
如果有n堆石子,n为奇数,先手必赢,如果n为偶数,且石子数两两相同,先手必输,否则就赢。
我自己想肯定想不出来的感觉……
#include<iostream>
#include<cstring>
using namespace std;
int a[105];
int main(){
int n;
while(cin>>n && n){
int flag = 0;
memset(a,0,sizeof(a));
for(int i = 0; i < n; i++){
int t;
cin>>t;
a[t]++;
}
if(n & 1)//如果是奇数,赢定了
cout<<"Win"<<endl;
else{
for(int i = 0; i <= 100; i++){
if(a