尼姆博弈:https://blog.csdn.net/BBHHTT/article/details/80199541
里面有个定理比较重要
题意,就是有一堆石子,一共有n个,把n个石子分成三堆,求有多少种分配的方式能够使得bob win?

很容易就能够明白题目是让干什么的,这道题目就是一道尼姆博弈的题目,先来讲下尼姆博弈,其实很简单,有n堆石子,如果n堆石子的异或和是0,则先手必败,否则先手胜。尼姆博弈是利用二进制的思想,那么本题也可以利用二进制的思想,可知,如果要使得Alice输并且Alice为先手,只需要使得三堆石子异或等于0 即可,首先共有n个石子,把n转化成二进制来表示,假设其中有k个1存在,如果要使得三堆石子异或为0,则在三堆石子数的二进制数的每位上1的个数都要是偶数位,又可知,在二进制中,高位的1是由低位进位而得到的,也就是说高位的1可以分解成两个低位的1,当n是奇数的时候,最低位为1且没有办法分解,所以输出0,所以当n为偶数的时候,就有(3^k - 3)/6个,(上一位的1可以拆成下一位的两个1和一个0,对于n在二进制下的每一个1都可以拆成3种情况(0都有三个位置可以选),所以为3^x,又因为如果每次0都选在同一个位置,就会出现0的情况,所以-3。然后这3堆的顺序无关,再除6.)
注意 pow( , )内参数的形式。

#include <bits/stdc++.h>
using namespace std;
int main()
{
   
	int t;
	scanf("%d", &t);
	while(t--)
	{
   
		long long n;
		cin>>n;
		if(n%2) cout<<0<<endl;
		else
		{
   
			int num=0;
			while(n)
			{
   
				if(n%2) num++;
				n>>=1;
			}
			long long ans= (pow(3.0,num)-3)/6;
			printf("%lld\n", ans);
		}
	}
	return 0;
}