缪尔赛思又来到了你的面前(哈希)

定义一棵根节点为 1 1 1 n ( 2 ≤ n ≤ 1 0 3 ) n(2≤n≤10^3) n(2n103) 个节点的树的哈希值为:
H = ∑ i = 1 n X i Y f a ( i ) m o d 998244353 H=∑^n_{i=1}X^iY^{fa(i)}\ mod\ 998244353 H=i=1nXiYfa(i) mod 998244353
f a ( i ) fa(i) fa(i) 表示 i i i 的父亲节点, 1 1 1 为根节点, f a ( 1 ) = 1 fa(1)=1 fa(1)=1

$X,Y(1≤X,Y<998244353) $为给定的两个随机值。

请构造两棵大小为 n n n 的树,他们有相同的哈希值,但两棵树要求不一样。

我们认为两棵大小为 n n n 的树不一样:

  • 记数组 f a ( i ) fa(i) fa(i) 表示第 i i i 个节点的父亲,其中 f a ( 1 ) = 1 fa(1)=1 fa(1)=1
  • 节点 1 1 1 2 2 2 3 … … n 3……n 3……n 对应的 f a ( 1 ) , f a ( 2 ) , f a ( 3 ) , … , f a ( n ) fa(1),fa(2),fa(3),…,fa(n) fa(1),fa(2),fa(3),,fa(n)排成一排,得到了我们所要的 f a fa fa数组。
  • 对于两棵树 u , v u,v u,v,其数组 f a u , f a v fa_u,fa_v fau,fav,存在一个 j j j,使得 f a u ( j ) ≠ f a v ( j ) fa_u(j)≠fa_v(j) fau(j)=fav(j),此时认为两棵树不一样。

你需要输出两棵树的 f a fa fa 数组。

你需要保证输出的 fa 数组可以构成一棵树。

保证输入数据必然有解。

输入格式

一行三个数 n , X , Y n,X,Y n,X,Y

输出格式

输出共两行。

每行 n n n个数,分别表示两棵树的 f a fa fa 数组。

若有多组解,请输出任意一组满足题意的解即可。

样例

input
8 1 1
output
1 1 1 6 1 1 1 1
1 1 1 1 1 1 1 1

这里先说明一个有趣的事实,然后再说明解题思路

我们知道最多有365个人的生日是不同的,但是随着生日不同的人数增多,概率下降的很快:当要找出23个人的生日不同时,概率就下降到了0.5;当要找出100个人的生日不同时,概率就下降到了 1 0 − 7 10^{-7} 107

所以哈希冲突的概率随着数量的增多上升的很快,本题就是利用这个性质

我们利用并查集+随机数进行树的构造,每次都能得到一个哈希值

当得到的哈希值出现重复时,我们就可以输出这两棵树的fa数组了

但是仅仅这样会TLE,需要优化

观察到只有20个节点的树就可以有很多种不同的结构,所以我们只对前20个节点进行随机排列,之后的所有节点全部连接到根节点上

AC代码如下

#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <random>
#include <map>
#define int unsigned long long
using namespace std;
const int max_n = 1e3;
const int max_try = 100050;
const int limit = 20;
const int p = 998244353;int n, x, y;
int fa2[max_try][limit + 1], tmpfa[limit + 1];
map<int, int>ans;int quick_pow(int x, int y) {int ret = 1;while (y) {if (y % 2) ret = (ret * x) % p;x = (x * x) % p;y /= 2;}return ret % p;
}void init(int n) {for (int i = 1; i <= n; i++) {tmpfa[i] = i;}
}int find(int x) {return x == tmpfa[x] ? x : (tmpfa[x] = find(tmpfa[x]));
}bool insame(int x, int y) {return find(x) == find(y);
}void merge(int x, int y) {x = find(x);y = find(y);tmpfa[x] = y;
}bool check(int id, int check, int tmpn, int tmphash) {init(tmpn);for (int i = 2; i <= tmpn; i++) {if (insame(i, fa2[id][i])) return false;else merge(i, fa2[id][i]);}for (int i = 2; i <= tmpn; i++) {if (!insame(1, i)) {return false;}}int hashcheck = tmphash;for (int i = 1; i <= n; i++) {hashcheck = ((hashcheck + (quick_pow(x, i) + quick_pow(y, fa2[id][i])) % p) % p) % p;}return check == hashcheck;
}signed main() {cin >> n >> x >> y;srand((unsigned)time(NULL));int cnt = 0;int tmpn = min(n, limit);int tmphash = 0;for (int i = tmpn + 1; i <= n; i++) {tmphash = (tmphash + (quick_pow(x, i) * quick_pow(y, 1)) % p) % p;}while (1) {int hash2 = (tmphash + (x * y) % p) % p;fa2[cnt][1] = 1;init(tmpn);int flag = 0;for (int i = 2; i <= tmpn; i++) {int rand_num = rand() % tmpn + 1;while (insame(i, rand_num)) rand_num = rand() % tmpn + 1;merge(i, rand_num);fa2[cnt][i] = rand_num;hash2 = (hash2 + (quick_pow(x, i) * quick_pow(y, fa2[cnt][i])) % p) % p;}if (ans.count(hash2)) {int tmpid = ans[hash2];for (int i = 1; i <= n; i++) {if (fa2[tmpid][i] != fa2[cnt][i]) {flag = 1;break;}}if (flag) {//if (check(tmpid, hash2, tmpn, tmphash) || //	check(cnt, hash2, tmpn, tmphash)) {//	printf("ERROR!");//	return -1;//}for (int i = 1; i <= n; i++) {if (i <= tmpn) printf("%lld", fa2[tmpid][i]);else printf("1");if (i != n) printf(" ");}printf("\n");for (int i = 1; i <= n; i++) {if (i <= tmpn) printf("%lld", fa2[cnt][i]);else printf("1");if (i != n) printf(" ");}return 0;}}else {ans[hash2] = cnt++;}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

断网之后的页面,Autox.js是点击还是上下滑动比较好?

在处理断网之后的页面&#xff0c;选择点击还是上下滑动作为刷新操作&#xff0c;取决于应用的设计和用户界面。通常&#xff0c;这两种操作都可以作为刷新页面的方式&#xff0c;但它们各自有不同的适用场景&#xff1a; 点击刷新 - 适用场景&#xff1a;如果应用提供了一个明…

Java进阶学习笔记7——权限修饰符

什么是权限修饰符&#xff1f; 就是用来限制类中的成员&#xff08;成员变量、成员方法、构造器、代码块....&#xff09;能够被访问的范围。 protected使用的比较少&#xff0c;但是程序员还是要阅读代码&#xff0c;看官方文档是怎么写的&#xff0c;都会接触到protected修饰…

C#串口通信-串口相关参数介绍

串口通讯(Serial Communication)&#xff0c;是指外设和计算机间&#xff0c;通过数据信号线、地线等&#xff0c;按位进行传输数据的一种双向通讯方式。 串口是一种接口标准&#xff0c;它规定了接口的电气标准&#xff0c;没有规定接口插件电缆以及使用的通信协议&#xff0c…

ssh 配置 authorized_keys 后无法免密登录

查看日志&#xff1a; tail -f /var/log/auth.log May 25 15:55:13 121 sudo: pam_unix(sudo:session): session opened for user root by root(uid0) May 25 15:55:13 121 sshd[550561]: Received signal 15; terminating. May 25 15:55:13 121 sshd[922866]: Server liste…

性能测试场景的设计方法

引用&#xff1a;根据2008年Aberdeen Group的研究报告&#xff0c;对于Web网站&#xff0c;1秒的页面加载延迟相当于少了11%的PV&#xff08;page view&#xff09;&#xff0c;相当于降低了16%的顾客满意度。如果从金钱的角度计算&#xff0c;就意味着&#xff1a;如果一个网站…

「探讨」:什么是网络审计?好用的网络审计系统推荐【图文详解】

网络是企业运营、政府管理、个人生活不可或缺的基础设施。 然而网络安全问题却日益凸显&#xff0c;数据泄露、网络攻击、欺诈行为等风险日益严重。 一、网络审计的定义 网络审计&#xff0c;又称信息技术审计或电子审计&#xff0c;是指审计人员运用专业技能和工具&#xff…

fdk-aac将aac格式转为pcm数据

int sampleRate 44100; // 采样率int sampleSizeInBits 16; // 采样位数&#xff0c;通常是16int channels 2; // 通道数&#xff0c;单声道为1&#xff0c;立体声为2FILE *m_fd NULL;FILE *m_fd2 NULL;HANDLE_AACDECODER decoder aacDecoder_Open(TT_MP4_ADTS, 1);if (!…

实战之快速完成 ChatGLM3-6B 在 GPU-8G的 INT4 量化和本地部署

ChatGLM3 (ChatGLM3-6B) 项目地址 https://github.com/THUDM/ChatGLM3大模型是很吃CPU和显卡的&#xff0c;所以&#xff0c;要不有一个好的CPU&#xff0c;要不有一块好的显卡&#xff0c;显卡尽量13G&#xff0c;内存基本要32GB。 清华大模型分为三种(ChatGLM3-6B-Base&…

“大数据建模、分析、挖掘技术应用研修班”的通知!

随着2015年9月国务院发布了《关于印发促进大数据发展行动纲要的通知》&#xff0c;各类型数据呈现出了指数级增长&#xff0c;数据成了每个组织的命脉。今天所产生的数据比过去几年所产生的数据大好几个数量级&#xff0c;企业有了能够轻松访问和分析数据以提高性能的新机会&am…

Vue3中为Ant Design Vue中table的checkbox加tooltip、popover

问题的产生 Vue版本&#xff1a;3.3.13 ant-design-vue 版本&#xff1a;3.x.x 在工作时遇到一个场景&#xff0c;需要在 ant-table 的 checkbox 被禁用的时候提示原因&#xff0c;但是在 ant-design-vue 文档中并没有发现有相关介绍。 首先我去看了issue中是否有提到相关问题…

【金砖赛】基于docker搭链

一&#xff0e;基于docker搭建 启动并检查是否启动成功 #启动命令 sudo systemctl start docker#检查命令 sudo systemctl status docker修改权限 chomd 777 build_chain.sh 进行4节点联盟链搭建&#xff08;举例&#xff09; sudo ./build_chain.sh -d -l "127.0.0.1…

OOM不会导致JVM退出

问题来源 一次生产事故&#xff0c;由于一次性从数据库查询过多数据导致线程 OOM&#xff1a;Java heap space 异常&#xff08;千万级表&#xff0c;JVM堆内存2G&#xff09;&#xff0c;但是在线程OOM发生时&#xff0c;java进程却没有立即挂掉。 ##OOM与异常 说到底OutOfM…

基于Android Studio记事本系统

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 具有登录&#xff0c;注册&#xff0c;记住密码&#xff0c;自动登录的功能&#xff1b; 可以新增记事本&#xff0c;编辑&#xff0c;删除记事本信息&#xff0c;同时可以设置主标题&#xff0c;内容&#xff0c;以及…

Ansible自动化运维中的Setup收集模块应用详解

作者主页&#xff1a;点击&#xff01; Ansible专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年5月22日13点14分 &#x1f4af;趣站推荐&#x1f4af; 前些天发现了一个巨牛的&#x1f916;人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xf…

服务器没有图形界面没有显示器怎么办

可以用vnc。 vnc是开元的。什么是vnc&#xff1f; 使用vnc 下载vnc和vncserver命令。 每生成一个图形界面就叫做开启session会话。 vnc相关命令&#xff1a; start a new session: vncserver。 如果没有会话&#xff0c;一般从:1开始 端口5901 vncserver :2 #指定会话为:2 端…

WinForm+SQL Server+.NET开发菜鸟驿站管理系统

完整效果看哔哩哔哩&#xff0c;有需要其他系统&#xff0c;可以私信

Leecode热题100---55:跳跃游戏(贪心算法)

题目&#xff1a; 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 贪心算…

Spring中的三级缓存和循环依赖

三级缓存 在 Spring 中&#xff0c;Bean 的创建过程涉及到三级缓存。这三级缓存分别是 singletonObjects、earlySingletonObjects 和 singletonFactories。它们在 Spring 容器启动时用于存储正在创建的 Bean 实例。 在 Spring 源码中&#xff0c;三级缓存涉及到了 DefaultSin…

python02 循环与容器

一、if的条件判断 1-1 if elif else 判断年龄属于哪个年龄段 # 判断学生 core input(请输入成绩) ​ if int(core) >90 :print(优秀) elif int(core) >70 and int(core) <90:print(中等) elif int(core) >60 and int(core) <70:print(及格) else:print(不及…

20240521在Ubuntu20.04下编译RK3588的IPC方案的编译环境问题makeinfo: not found

20240521在Ubuntu20.04下编译RK3588的IPC方案的编译环境问题makeinfo: not found 2024/5/21 20:52 viewproviewpro-ThinkBook-16-G5-IRH:~/RK3588_IPC_SDK$ sudo apt-get install texinfo viewproviewpro-ThinkBook-16-G5-IRH:~$ viewproviewpro-ThinkBook-16-G5-IRH:~$ md5su…