Number Cutting Game HDU

两个对于一个数切割 k 次,然后切割以后把这些值加起来,然后继续切割 k 次,问谁先没有办法切割。

对于第一个人,先枚举每种切割的情况,然后拿去给第二个人切割,如果第二个人怎么样都没办法切割出来,那么就是第一个人赢。如果第二个人有办法切割,在枚举第二个人所有可以切割的情况,给第一个人切割,如果第一个人没法切割,那么第二个人赢,如果第一个人还有办法切割,就继续循环下去。

#include<map>
#include<set>
#include<ctime>
#include<cmath>
#include<stack>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x & (-x))
#define INOPEM freopen("in.txt", "r", stdin)
#define OUTOPEN freopen("out.txt", "w", stdout)

typedef unsigned long long int ull;
typedef long long int ll;
const double pi = 4.0*atan(1.0);
const int inf = 0x3f3f3f3f;
const int maxn = 2e6+5;
const int maxm = 1005000;
const int mod = 1e9+7;
using namespace std;

ll n, m;
int T, tol;
ll a[20];

ll dfs(ll nn, ll sum, ll cnt) {
    if(cnt < m-1 && nn == 0)    return 0;
    if(cnt == m-1) {
        if(dfs(nn + sum, 0, 0))    return 0;
        return 1;
    }
    for(int i=1; a[i]<=nn; i++) {
        if(dfs(nn/a[i], sum+nn%a[i], cnt+1))    return 1;
    }
    return 0;
}

int main() {
    a[0] = 1;
    for(int i=1; i<=19; i++)    a[i] = a[i-1]*10;
    while(~scanf("%lld%lld", &n, &m)) {
        int ans = dfs(n, 0, 0);
        printf("%d
", ans);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/Jiaaaaaaaqi/p/9525809.html