若$(i,j)\in E$,实际上会不断推出$(p_{i},p_{j})\in E,(p_{p_{i}},p_{p_{j}})\in E,...$

考虑将$i$向$p_{i}$连边得到了一张(由若干个环组成的)有向图,则$(i,j)\in E$有以下两个必要条件:

1.若$i$和$j$在同一个环中,则对应环长$l$必须恰为2

设$d$为$i$和$j$的环上距离,则环上距离为$d$的点对间都有边,则这$l$个点之间至少有$l$条边(特别的,若$l=2$时有重边),显然会产生环

2.若$i$和$j$不在同一个环中,假设两者对应环长分别为$u$和$v$,则$u\mid v$或$v\mid u$

(不妨假设$u\le v$)设$d=\gcd(u,v)$,则与$i$环上距离$\equiv $与$j$环上距离$(mod\ d)$的点对间都有边,也即这$u+v$个点之间至少有$\frac{uv}{d}$条边,二若$d<u$则$\frac{uv}{d}\ge 2v\ge u+v$,显然会产生环

另外,根据上述分析还可以得到对于$u\mid v$的情况,这两个环之间会恰有$v$条边

接下来,将图转换到环上,即对所有环之间连边,两环之间有边当且仅当存在一个点对之间有边

继续分析第2类边,还可以得到以下三个个必要条件:

1.两个环之间至多存在一条边

注意到两条边所产生的边必然不同,将两者边数相加即为$2v\ge u+v$,显然会产生环

2.一个环至多向一个环长严格小于其的环连边

假设其环长为$v$,严格小于其的环长为$u_{1}$和$u_{2}$,则边数为$2v$而点数为$v+u_{1}+u_{2}\le 2v$,显然会产生环

3.对于环长相同的点,其内部的边不会产生环

假设环长为$l$,产生的简单环环长为$l'$,则点数和边数均为$ll'$,显然会产生环

根据上述必要条件,可以得到以下推论:环之间的边也不存在环,进而也即是一棵树

以其中环长最小的点为根,得到一棵有根树,那么树上每一条边父亲的环大小必然不超过儿子,进而实际上的边数即其儿子的环大小,总边数也即$n-$根节点的环大小

接下来,需要对是否存在大小为1,2的环分类讨论:

1.若存在大小为1的环,显然以某个大小为1的环为根,再为其余环找一个父亲,此时已经存在$n-1$条边,即不会存在第1类边,并且可以证明:1.此时的原图是一棵树;2.每一条边实际上还对应于父亲的环大小种方案

换言之,也即求所有这样的树(根确定)每一个非根节点父亲环大小乘积和

考虑求出每一种环长对答案的贡献并相乘,而对于其中大小为$i$的环,假设有$cnt$个,令$w$为环长是其约数的环大小和$,f(n,m)$为$n$个点$m$个根的森林数,则贡献为$\sum_{m=1}^{cnt}w^{m}i^{cnt-m}f(cnt,m)$

根据purfer序列,可以得到$f(n,m)={n-1\choose m-1}n^{n-m-1}$,代入后即为$w(w+i\cdot cnt)^{cnt-1}$

2.若不存在大小为1的环且存在大小为2的环,显然以某个大小为2的环为根,并需要再挑一个大小为2的环在其中连第1类边来保证环的性质,也即在第1种情况的基础上乘上大小为2的环个数即可

3.若不存在大小为1或2的环,此时显然无解

最终,时间复杂度为$o(n\log n)$(统计$w$),可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 300005
4 #define mod 998244353
5 #define ll long long
6 vector<int>v[N];
7 int n,s,ans,a[N],vis[N],cnt[N];
8 int qpow(int n,int m){
9 int s=n,ans=1;
10 while (m){
11 if (m&1)ans=(ll)ans*s%mod;
12 s=(ll)s*s%mod;
13 m>>=1;
14 }
15 return ans;
16 }
17 void dfs(int k){
18 if (vis[k])return;
19 s++,vis[k]=1,dfs(a[k]);
20 }
21 int main(){
22 scanf("%d",&n);
23 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
24 for(int i=1;i<=n;i++)
25 if (!vis[i])s=0,dfs(i),cnt[s]++;
26 ans=1;
27 for(int i=1;i<=n;i++)
28 for(int j=(i<<1);j<=n;j+=i)v[j].push_back(i);
29 if ((!cnt[1])&&(!cnt[2])){
30 printf("0\n");
31 return 0;
32 }
33 int st=2;
34 if (cnt[1]){
35 if (cnt[1]!=1)ans=qpow(cnt[1],cnt[1]-2);
36 }
37 else{
38 st=3;
39 ans=(ll)qpow(cnt[2],cnt[2]-1)*qpow(2,cnt[2]-1)%mod;
40 }
41 for(int i=st;i<=n;i++){
42 if (!cnt[i])continue;
43 int w=0,s=0;
44 for(int j=0;j<v[i].size();j++)w+=v[i][j]*cnt[v[i][j]];
45 ans=(ll)ans*w%mod*qpow(w+i*cnt[i],cnt[i]-1)%mod;
46 }
47 printf("%d\n",ans);
48 return 0;
49 }

[Aizu2993]Invariant Tree的更多相关文章

  1. BRISK: Binary Robust Invariant Scalable Keypoints

    注意:本文含有一些数学公式,如果chrome不能看见公式的话请用IE打开网站 1.特征点提取   特征点提取有以下几个步骤: a.尺度空间金字塔结构的构造 和SIFT类似,尺度空间金字塔是由不同的尺度 ...

  2. Codeforces Round #319 (Div. 1) B. Invariance of Tree 构造

    B. Invariance of Tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/576/ ...

  3. Lowest Common Ancestor in Binary Tree

    The problem: Given node P and node Q in a binary tree T. Find out the lowest common ancestor of the ...

  4. Red–black tree ---reference wiki

    source address:http://en.wikipedia.org/wiki/Red%E2%80%93black_tree A red–black tree is a type of sel ...

  5. Image Processing and Computer Vision_Review:Local Invariant Feature Detectors: A Survey——2007.11

    翻译 局部不变特征探测器:一项调查 摘要 -在本次调查中,我们概述了不变兴趣点探测器,它们如何随着时间的推移而发展,它们如何工作,以及它们各自的优点和缺点.我们首先定义理想局部特征检测器的属性.接下来 ...

  6. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  7. SAP CRM 树视图(TREE VIEW)

    树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...

  8. 无限分级和tree结构数据增删改【提供Demo下载】

    无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...

  9. 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

随机推荐

  1. MySQL8.0.20安装教程,MySQL8.0.20安装详细图文教程

    1.下载链接如下: MySQL8.0.20版本 https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-20.html 其他版本:MySQL8 ...

  2. 寻找最佳路径(ArcPy实现)

    一.背景 随着社会经济发展需求,公路的重要性日益提高.在一些交通欠发达的地区,公路建设迫在眉睫.如何根据实际地形情况设计出比较合理的公路规划,是一个值得研究的问题. 二.实验目的: (1)通过练习,熟 ...

  3. python socket zmq

    本篇博客将介绍zmq应答模式,所谓应答模式,就是一问一答,规则有这么几条 1. 必须先提问,后回答 2. 对于一个提问,只能回答一次 3. 在没有收到回答前不能再次提问 上代码,服务端: #codin ...

  4. 【c++ Prime 学习笔记】第12章 动态内存

    对象的生存期: 全局对象:程序启动时创建,程序结束时销毁 局部static对象:第一次使用前创建,程序结束时销毁 局部自动对象:定义时创建,离开定义所在程序块时销毁 动态对象:生存期由程序控制,在显式 ...

  5. Sequence Model-week1编程题3-用LSTM网络生成爵士乐

    Improvise a Jazz Solo with an LSTM Network 实现使用LSTM生成音乐的模型,你可以在结束时听你自己的音乐,接下来你将会学习到: 使用LSTM生成音乐 使用深度 ...

  6. Java:并发笔记-04

    Java:并发笔记-04 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 本章内容-3 线程状态转换 活跃性 Lock 3.10 重新理解线程状态转换 假设有线 ...

  7. [Beta]the Agiles Scrum Meeting 12

    会议时间:2020.5.27 21:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 issue yjy 帮助解决技术问题 tq 撰写技术博客 wjx 博客评分界面美化 dzx 博客评分界 ...

  8. 软工博客之关于CSDN的移动端软件测评

    关于CSDN的移动端软件测评 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 软件测评作业 我在这个课程的目标 不求变强,只求做好,成为一颗有用的 ...

  9. hystrix的配置说明

    在我们的日常开发中,有些时候需要和第三方系统进行对接操作,或者调用其他系统的 api 接口,但是我们不能保证这些第三方系统的接口一定是稳定的,当系统中产生大量的流量来访问这些第三方接口,这些第三方系统 ...

  10. 在Ubuntu下安装Solr

    使用wget命令去官网下载solr的压缩包. 1 wget https://mirrors.bfsu.edu.cn/apache/lucene/solr/8.6.3/solr-8.6.3.tgz 使用 ...