https://codeforces.com/problemset/problem/1215/D
思路:
取石子的取1,2....次都有结论吧。这里类似。
首先就是如果两边?不等最后会到达一个一边都是?的状态,两边也有一个差。
此时问题变成了给你一堆石头,每次可以取1,2,...9个。先手和后手谁赢。看%9即可。
这里还有一个小限制就是每个人要取剩下的?数量/2次。
这样思考,也就是说不管A取x,B能保证的就是取y为9-x,也就是只能保证是9的倍数。一共n/2次,也就是n/2*9==sum,B赢。不然就是A赢
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=2e5+1000;
typedef long long LL;
char a[maxn],b[maxn],s[maxn];
LL tot1=0,tot2=0;
inline LL read(){LL x=0,f=1;char ch=getchar(); while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;}
int main(void)
{
LL n;cin>>n;
scanf("%s",s+1);
for(LL i=1;i<=n/2;i++) a[++tot1]=s[i];
for(LL i=n/2+1;i<=n;i++) b[++tot2]=s[i];
LL sum1=0;LL qnum1=0;
for(LL i=1;i<=tot1;i++){
if(a[i]=='?') qnum1++;
if(a[i]>='0'&&a[i]<='9') sum1+=(a[i]-'0');
}
LL sum2=0;LL qnum2=0;
for(LL i=1;i<=tot2;i++){
if(b[i]=='?') qnum2++;
if(b[i]>='0'&&b[i]<='9') sum2+=(b[i]-'0');
}
LL numcnt=sum1-sum2;
if(numcnt==0){
if(qnum1==qnum2) cout<<"Bicarp"<<"\n";
else cout<<"Monocarp"<<"\n";
}
else{
if(numcnt>0){
LL res=(qnum2-qnum1)/2;
if(res*9==numcnt) cout<<"Bicarp"<<"\n";
else cout<<"Monocarp"<<"\n";
}
else if(numcnt<0){
LL res=(qnum1-qnum2)/2;
if(res*9==abs(numcnt)) cout<<"Bicarp"<<"\n";
else cout<<"Monocarp"<<"\n";
}
}
return 0;
}