蓝桥杯2021国赛-异或三角

题目链接

题意

题解

因为 a ⊕ b ⊕ c = 0 a⊕b⊕c=0 abc=0 a 、 b 、 c a、b、c abc 互不相等,同时每位上 1 1 1 的个数为 0 0 0 2 2 2。设 n ≥ a > b > c ≥ 1 n≥a>b>c≥1 na>b>c1,那么对每一位来讲, ( 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=bc,a<b+c=>bc<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;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值