“浪潮杯”山东第七届ACM TribleNim

题目链接

TribleNim

题解

题意

一堆石子分成三份的Nim游戏,求先手必败的组合数。

思路

首先我们需要知道这个结论: a ⨁ b ⨁ c = = 0 a \bigoplus b \bigoplus c == 0 abc==0 的情况下先手必败,其中abc为每一堆石子的数量。

接下来我们分情况讨论:

在石子总数为奇数的情况下,没有办法使得异或和为0。将一个奇数拆分成三个整数,则其中必然存在至少一个奇数使得该位的异或和为1

在石子总数为偶数的情况下,要使得三堆石子的异或和为0,我们需要使得二进制数字的每一位中值为1的数字的数量为2,或者0
这样才可以使得最终的异或和的每一位都为0
举个例子:

14 = 1110 = 1000 + 100 + 10;
其中 1000 = 0000 + 0100 + 0100, 100 = 000 + 010 + 010, 10 = 00 + 01 + 01.

可以看到其中的每一位1所拆成的三个数字都有两个1和一个0,对于这三个数字可以有三种排列:011101110.
所以我们的答案为 3 N 3^N 3N.

真的吗?考虑一下题意,每一堆石子的数量都不能为0,并且对于情况[1,2,3][1,3,2]是算作同一种情况的,那么我们就需要减去这两种情况的数量。

首先考虑石子数量为0的情况,由于我们拆分每个1后有三种情况,其中最多只有一位为0,所以所得的石子中最多只有一堆的数量为0。一共有三堆,所以需要减去3

再考虑重复的情况,每三位数字都有三种全排列,即 A 3 3 = 6 A^3_3 = 6 A33=6种情况,所以除以6。

这样就得到了最终的结果 a n s = ( 3 s u m − 3 ) / 6 ans = (3^{sum} - 3) / 6 ans=(3sum3)/6,其中sum为石子总数的二进制表示中1的数量。

AC代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<deque>
#include<vector>
#include<ctime>
using namespace std;
//#pragma GCC optimize(2)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define ull unsigned long long
#define ll long long
#define rep(i, x, y) for(int i=x;i<=y;i++)
#define mms(x, n) memset(x, n, sizeof(x))
#define mmc(A, tree) memcpy(A, tree, sizeof(tree))
#define eps (1e-8)
#define PI (acos(-1.0))
#define INF (0x3f3f3f3f)
#define mod (ull)(1e9+7)
typedef pair<int, int> P;

int main() {
    
    
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
#endif
    int T;scanf("%d", &T);
    while (T--) {
    
    
        ll n; scanf("%lld", &n);
        if (n & 1) printf("0\n");
        else {
    
    
            ll num = 0;
            while (n) {
    
    
                if (n & 1) num += 1;
                n >>= 1;
            }
            ll ans = (pow(3, num) - 3) / 6;
            printf("%lld\n", ans);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45934120/article/details/108629525
今日推荐