题意
题解
因为 a ⊕ b ⊕ c = 0 a⊕b⊕c=0 a⊕b⊕c=0, a 、 b 、 c a、b、c a、b、c 互不相等,同时每位上 1 1 1 的个数为 0 0 0 或 2 2 2。设 n ≥ a > b > c ≥ 1 n≥a>b>c≥1 n≥a>b>c≥1,那么对每一位来讲, ( 1 , 1 , 0 ) (1,1,0) (1,1,0) 先于 ( 1 , 0 , 1 ) (1,0,1) (1,0,1) 出现。
再考虑能组成三角形,意味着必须存在一组 ( 0 , 1 , 1 ) (0,1,1) (0,1,1),因为 a = b ⊕ c , a < b + c = > b ⊕ c < b + c a=b⊕c,a<b+c => b⊕c<b+c a=b⊕c,a<b+c=>b⊕c<b+c
那么可以以枚举a、c,同时设一个状态保证 ( 1 , 1 , 0 ) (1,1,0) (1,1,0) 先于 ( 1 , 0 , 1 ) (1,0,1) (1,0,1) 出现,具体见代码注释
代码
#include<bits/stdc++.h>
#define LL long long
using namespace std;
int T,n;
LL f[39][2][2][2][2];
LL dfs(int a,int c,int i,int j,int k)
{
if(i==-1) return k;
if(f[i][j][k][c][a]!=-1) return f[i][j][k][c][a];
int top=(j?((n>>i)&1):1);
LL res=0;
for(int bt=0;bt<=top;bt++)
{
int nj=(j&&(bt==top));
if(!bt)
{
res+=dfs(a,c,i-1,nj,k); //全0
if(c!=0) res+=dfs(a,1,i-1,nj,1); //给b、c,若c==0,给b、c的话会使b>a
}
else
{
if(!a) res+=dfs(1,c,i-1,nj,k); //a最大,最高位1给a和b
else
{
res+=dfs(1,c,i-1,nj,k); //给a、b
res+=dfs(1,1,i-1,nj,k); //给a、c
}
}
}
return f[i][j][k][c][a]=res;
}
int main()
{
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin>>T;
while(T--)
{
cin>>n;
memset(f,-1,sizeof(f));
cout<<dfs(0,0,31,1,0)*6ll<<"\n";
}
return 0;
}