栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

蓝桥杯2021国赛-异或三角

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

蓝桥杯2021国赛-异或三角

题目链接

题意

题解

因为 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⊕cb⊕c

那么可以以枚举a、c,同时设一个状态保证 ( 1 , 1 , 0 ) (1,1,0) (1,1,0) 先于 ( 1 , 0 , 1 ) (1,0,1) (1,0,1) 出现,具体见代码注释

代码
#include
#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<
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/954269.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号