Processing math: 100%

CF 852E Casinos and travel

题目链接

Desccription
给定一棵树,John从任意一个点开始,每次走向一个未到达过的点。每个点都可以有或没有赌场,每经过一个赌场心情都会反转,旅行开始前心情很好。
问有多少种方案使得旅行结束后心情很好。

n105


Solution
把题目抽象一下:
每个点随机一个0/1的权值,随机选择一个点作为根,有多少种方案使得根节点到所有叶节点路径上的异或和为0

发现叶节点到根的路径的权值异或和可以由叶节点确定。记叶节点数为tot
1.若所选的根节点不是叶节点,那么除叶节点外的ntot个点的权值可以随便选,方案数为(ntot)×2ntot
2.若所选的根节点是叶节点,那么除其他ntot1个叶节点外的所有的点权值可以随便选,方案数为tot×2ntot+1

ans=(ntot)×2ntot+tot×2ntot+1=(n+tot)×2ntot

#include<complex>
#include<cstdio>
using namespace std;
const int mod=1e9+7;
const int N=1e5+7;
int n,tot;
int in[N];
int qread()
{
	int x=0;
	char ch=getchar();
	while(ch<'0' || ch>'9')ch=getchar();
	while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x;
}
long long Fpow(long long b,int p)
{
	long long res=1;
	for(;p;p>>=1,b=b*b%mod)
		if(p&1)res=res*b%mod;
	return res;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<n;i++)
		in[qread()]++,in[qread()]++;
	for(int i=1;i<=n;i++)
		if(in[i]==1)tot++;
	printf("%d\n",(n+tot)*Fpow(2,n-tot)%mod);
	return 0;
}
posted @   LeTri  阅读(251)  评论(0编辑  收藏  举报
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 从 Windows Forms 到微服务的经验教训
· 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
点击右上角即可分享
微信分享提示