hdu 2848 Number Cutting Game
给一个数,两个人轮流把这个切成k段并把k段加和给下一个人切,谁先无法切谁就失败。
dfs+博弈
具体看代码注释
#include <bits/stdc++.h> #define pb push_back #define mp make_pair #define x first #define y second #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define up rt,rt<<1,rt<<1|1 #define mem(x) memset(x,0,sizeof(x)) #define mem1(x) memset(x,-1,sizeof(x)) #define LMissher using namespace std; typedef long long ll; typedef double db; const int M = 1e5+7; const double pi = acos(-1); const int inf = 2147483647; const int mod = 1e9+7; ll fac[20]; ll n; ll k; int dfs(ll res,ll sum,ll cnt){ //if(cnt<k-1&&res==0) return 0; if(cnt==k-1){//我的回合切分完毕 if(dfs(sum+res,0,0))//与我博弈的人能完成切分他胜 return 0; return 1;//否则我胜 } for(int i=1;fac[i]<=res;i++){//枚举所有的切分情况 if(dfs(res/fac[i],sum+res%fac[i],cnt+1))//有一个成功则这个状态必胜 return 1; } return 0;//无法切分或者没有一个胜利态 } int main(){ #ifdef LMissher freopen("1.in","r",stdin); freopen("1.out","w",stdout); #endif fac[0]=1; for(int i=1;i<=19;i++) fac[i]=fac[i-1]*10; while(~scanf("%lld%lld",&n,&k)){ printf("%d\n",dfs(n,0,0)); } return 0; }

浙公网安备 33010602011771号