题目


分析

考虑建出一棵Trie,然后最小生成树就是0的部分到1的部分连一条边,

这个可以用区间短的一方查询另一棵trie,这样时间复杂度为 \(O(n\log^2{mx})\)

方案数注意相同的 \(n\) 个点的无根树为 \(n^{n-2}\)


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
const int N=3000011,mod=1000000007; long long ans;
int trie[N][2],L[N],R[N],tot=1,Ans=1,n,a[N];
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
int ksm(int x,int y){
int ans=1;
for (;y;y>>=1,x=1ll*x*x%mod)
if (y&1) ans=1ll*ans*x%mod;
return ans;
}
void Insert(int x,int rk){
int p=1;
for (int i=29;~i;--i){
int z=(x>>i)&1;
if (!trie[p][z]) trie[p][z]=++tot;
p=trie[p][z],R[p]=rk;
if (!L[p]) L[p]=rk;
}
}
int query(int p,int dep,int x,int &C){
if (dep<0){
C=R[p]-L[p]+1;
return 0;
}
int z=(x>>dep)&1;
if (trie[p][z]) return query(trie[p][z],dep-1,x,C);
else return query(trie[p][z^1],dep-1,x,C)|(1<<dep);
}
long long dfs(int p,int dep){
if (dep<0){
int len=R[p]-L[p]+1;
if (len>2) Ans=1ll*Ans*ksm(len,len-2)%mod;
return 0;
}
int ls=trie[p][0],rs=trie[p][1],ans0=1<<30,ans1=0;
if (!ls) return dfs(rs,dep-1);
if (!rs) return dfs(ls,dep-1);
if (R[ls]-L[ls]>R[rs]-L[rs]) ls^=rs,rs^=ls,ls^=rs;
for (int i=L[ls],C;i<=R[ls];++i){
int now=query(rs,dep-1,a[i],C);
if (ans0>now) ans0=now,ans1=C;
else if (ans0==now) ans1=(ans1+C)%mod;
}
Ans=1ll*Ans*ans1%mod;
return dfs(ls,dep-1)+dfs(rs,dep-1)+ans0+(1<<dep);
}
int main(){
n=iut(),L[1]=1,R[1]=n;
for (int i=1;i<=n;++i) a[i]=iut();
sort(a+1,a+1+n);
for (int i=1;i<=n;++i) Insert(a[i],i);
ans=dfs(1,29);
return !printf("%lld\n%d",ans,Ans);
}

#01-Trie,Cayley定理#51nod 1601 完全图的最小生成树计数的更多相关文章

  1. 51Nod 1601 完全图的最小生成树计数

    题目链接 分析: 这是一张完全图,并且边的权值是由点的权值$xor$得到的,所以我们考虑贪心的思想,考虑$kruskal$的过程选取最小的边把两个连通块合并,所以我们可以模仿$kruskal$的过程, ...

  2. 「51Nod 1601」完全图的最小生成树计数 「Trie」

    题意 给定\(n\)个带权点,第\(i\)个点的权值为\(w_i\),任意两点间都有边,边权为两端点权的异或值,求最小生成树边权和,以及方案数\(\bmod 10^9 + 7\) \(n \leq 1 ...

  3. 51Nod1601 完全图的最小生成树计数 Trie Prufer编码

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1601.html 题目传送门 - 51Nod1601 题意 题解 首先我们考虑如何求答案. 我们将所有 ...

  4. 51Nod1601 完全图的最小生成树计数

    传送门 我居然忘写题解啦!(记忆废) 不管怎么说,这题还算是一道好题啊……你觉得敦爷出的题会有水题么 …… 这题比较容易把人误导到Boruvka算法之类的东西上去(我们机房去刚D题的人一开始大多也被误 ...

  5. prufer编码 cayley定理

    背景(在codeforces 917D 报废后,看题解时听闻了这两个玩意儿.实际上917D与之“木有关西”,也可以认为是利用了prufer的一些思路.) 一棵标号树的Pufer编码规则如下:找到标号最 ...

  6. Prüfer序列和cayley定理

    参考资料: 1.matrix67 <经典证明:Prüfer编码与Cayley公式> 2.百度百科 3.Forget_forever prufer序列总结 4.维基百科 5.dirge的学习 ...

  7. Nyoj 星际之门(一)(Cayley定理)

    描述 公元3000年,子虚帝国统领着N个星系,原先它们是靠近光束飞船来进行旅行的,近来,X博士发明了星际之门,它利用虫洞技术,一条虫洞可以连通任意的两个星系,使人们不必再待待便可立刻到达目的地. 帝国 ...

  8. Codeforces1113F. Sasha and Interesting Fact from Graph Theory(组合数学 计数 广义Cayley定理)

    题目链接:传送门 思路: 计数.树的结构和边权的计数可以分开讨论. ①假设从a到b的路径上有e条边,那么路径上就有e-1个点.构造这条路径上的点有$A_{n-2}^{e-1}$种方案: ②这条路径的权 ...

  9. hdu 4825 Xor Sum (01 Trie)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825 题面: Xor Sum Time Limit: 2000/1000 MS (Java/Others) ...

  10. 图论:Prufer编码-Cayley定理

    BZOJ1430:运用Cayley定理解决树的形态统计问题 由Prufer编码可以引申出来一个定理:Cayley 内容是不同的n结点标号的树的数量为n^(n-2) 换一种说法就是一棵无根树,当知道结点 ...

随机推荐

  1. Redis原理学习:Redis主体流程分析

    转自:七把刀 https://www.jianshu.com/p/427cf97d7951 网上分析Redis源码的文章挺多,如黄健宏的<Redis设计与实现>就很详尽的分析了redis源 ...

  2. 常用Windows控制台命令

    查看网络连接信息 1.查看所有网络连接 netstat -ano -a 显示所有连接和侦听端口. -n 以数字形式显示地址和端口号. -o 显示拥有的与每个连接关联的进程 ID. 详细的使用方式使用n ...

  3. 【Java复健指南03】递归思想

    [递归] 递归重要规则 1.执行一个方法时,就创建一个新的受保护的独立空间(栈空间) 方法的局部变量是独立的,不会相互影响,比如n变量 如果方法中使用的是引用类型变量(比如数组,对象),就会共享该引用 ...

  4. 07、Etcd 中Raft算法简介

    本篇内容主要来源于自己学习的视频,如有侵权,请联系删除,谢谢. 思考: etcd是如何基于Raft来实现高可用.数据强-致性的? 1.什么是Raft算法 Raft 算法是现在分布式系统开发首选的共识算 ...

  5. 【Azure Web Job】Azure Web Job执行Powershell脚本报错 The term 'Select-AzContext' is not recognized as the name

    问题描述 Azure Web Job执行Powershell脚本报错 Select-AzContext : The term 'Select-AzContext' is not recognized ...

  6. 【Azure 事件中心】在Azure Function App中消费Event Hub数据,时常出现EventReceiveError

    问题描述 在Azure Function App中消费Event Hub数据,时常出现EventReceiveError:New receiver 'P3-00122a562-4fa4-7f3f-ad ...

  7. Python实现snap:对齐多张遥感影像的空间范围

      本文介绍基于Python中ArcPy模块,实现基于栅格图像批量裁剪栅格图像,同时对齐各个栅格图像的空间范围,统一其各自行数与列数的方法.   首先明确一下我们的需求.现有某一地区的多张栅格遥感影像 ...

  8. mysql-查询库中所有表名称或者某一张表的所有字段名称

    -- 查询某一库中所有表的名称, SELECT a.TABLE_SCHEMA ,a.TABLE_NAME ,a.TABLE_COMMENT FROM information_schema.TABLES ...

  9. Linux 系统错误码 errno 剖析

    一.errno 介绍 1.1 errno 简介 Linux 中系统调用的错误都存储于错误码 errno 中.errno 由操作系统维护,存储就近发生的错误,即下一次的错误码会覆盖掉上一次的错误. er ...

  10. 2024-03-09:用go语言,我们把无限数量的栈排成一行,按从左到右的次序从 0 开始编号, 每个栈的的最大容量 capacity 都相同。实现一个叫「餐盘」的类 DinnerPlates, Di

    2024-03-09:用go语言,我们把无限数量的栈排成一行,按从左到右的次序从 0 开始编号, 每个栈的的最大容量 capacity 都相同.实现一个叫「餐盘」的类 DinnerPlates, Di ...