题解:P11010 『STA - R7』Divide and Merge Game
P11010 解题报告
前言
很好猜的结论题。
这是篇和官解证明思路略有出入的题解。
思路分析
结论题当然要手玩数据了
设
结论:Alice 获胜当且仅当
考虑怎样证明。
(注:为方便表述,下述集合
充分性
即
考虑构造这样一个集合
不难发现,Bob 想要划分的非空集合,其元素之和至大为
必要性
即
考虑构造一种合法的划分方式。设
弱化条件:限定 Bob 所划分的集合元素和为
当
因为集合
不难发现,极大元素和是一个 01 背包问题,这启发我们打表验证(在 IOI 赛制中,其实可以交一发来验证)。
打表验证可知,当
然后改变弱化条件:限定 Bob 所划分的集合元素和为
当
当
代码实现
我采用了线性筛
AC code
#include<bits/stdc++.h>
using namespace std;
int t,n,k;
bool not_prime[100000005];
int prime[50000005],maxn[100000005],cnt;
void seive(int n){
for(int i=2;i<=n;i++){
if(!not_prime[i]) prime[++cnt]=i,maxn[i]=1;
for(int j=1;j<=cnt && i*prime[j]<=n;j++){
not_prime[i*prime[j]]=1;
maxn[i*prime[j]]=i;
if(i%prime[j]==0) break;
}
}
}
int main(){
seive(100000000);
cin>>t;
while(t--){
cin>>n>>k;
if(n-k+1>maxn[n]) cout<<"Alice"<<'\n';
else cout<<"Bob"<<'\n';
}
}
后记
在考场上,证明结论可以采用证明与打表验证结合的做法,可能会有奇效。
祝点赞的各位