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;
}
View Code

 

posted @ 2018-09-10 16:23  LMissher  阅读(180)  评论(0)    收藏  举报