题解:P7656 [BalticOI 1996] A NUMBER GAME (Day 2)
yinpeichu2021 · · 题解
题意
有两个整数
输出格式:
首先输出一行表示 A 是否有必胜策略。接下来,设 A 第一次选择的数为
具体的还是见代码吧。。。
Sol
由于
具体地,设
输出详情见代码。
Code
#include<bits/stdc++.h>
#define eps 1e-6
#define MOD 998244353
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
typedef pair<int,int> pii;
typedef pair<pii,int> piii;
#define fi first
#define se second
#define MAXN 300005
int n,m;
int f[1<<21];
int dfs(int sta){
int x=n;// x 表示操作后得到的 n'
for(int i=0;i<m;i++)
if((sta>>i)&1)x-=i+1;
if(!x)return f[sta]=0;// 边界,若无法操作则必败
if(f[sta]!=-1)return f[sta];// 记忆化
f[sta]=0;
for(int i=0;i<m&&i<x;i++)
if(!((sta>>i)&1)){
int now=sta+(1<<i);
if(!dfs(now))f[sta]=1;
}
return f[sta];
}
signed main(){
cin>>n>>m,m=min(n,m);
for(int i=0;i<(1<<m);i++)f[i]=-1;
if(dfs(0))puts(" A wins");
else puts(" B wins");
for(int k=1;k<=m;k++){
if(k<10)cout<<' '<<k<<' ';
else cout<<k<<' ';
// 毒瘤输出
if(f[1<<(k-1)]==0){puts("winning");continue;}
else{
int x=n-k,mx=0;
for(int i=0;i<m&&i<x;i++)
if(i!=k-1)
if(f[(1<<(k-1))+(1<<i)]==0)
mx=i+1;
cout<<mx<<'\n';
}
}
return 0;
}
后记
题意错了,输出格式不对,下了数据才知道那个输出格式。当然也有可能是数据本身就有误。建议评绿。
如果数据改了,at 我一下。