若$(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. nsq topic

    与Topic相关的代码主要位于nsqd/topic.go中. 上一篇文字我们讲解了下nsq的启动流程.对nsq的整体框架有了一个大概的了解.本篇文章就是由大到小.对于topic这一部分进行详尽的讲解. ...

  2. 打开属性页,分别在Debug和Release下将其配置类型改为:静态库(.lib);

    右键工程->属性 配置类型里面的下拉菜单选择静态库

  3. Rafy 框架 - 实体支持只更新部分变更的字段

    Rafy 快一两年没有大的更新了.并不是这个框架没人维护了.相反,主要是因为自己的项目.以及公司在使用的项目,都已经比较稳定了,也没有新的功能添加.但是最近因为外面使用了 Rafy 的几个公司,找到我 ...

  4. 学校选址(ArcPy实现)

    一.背景 合理的学校空间位置布局,有利于学生的上课与生活.学校的选址问题需要考虑地理位置.学生娱乐场所配套.与现有学校的距离间隔等因素,从总体上把握这些因素能够确定出适宜性比较好的学校选址区. 二.目 ...

  5. React实现组件全屏化

    介绍 本文基于React+antd,给大家演示一个完整的全屏demo. 起因是开发今天给我提了一个sql编辑器输入框比较小,不支持放大,不太方便.希望能够全屏显示,联想到自己以后可能也会需要,便研究并 ...

  6. 使用CSS选择器(第一部分)

    目录 使用CSS选择器(第一部分) 使用CSS基本选择器 选择所有元素 通用选择器 代码清单1 使用通用选择器 根据类型选择元素 元素类型选择器 代码清单2 使用元素类型选择器 提示 根据类选择元素 ...

  7. Frida过反调试

    原理介绍:https://www.anquanke.com/post/id/85996 code setImmediate(function () { Java.perform(function () ...

  8. CAD网页Web端显示开发为什么要以WebGIS的思路来开发?

    背景 在之前的博文CAD图DWG解析WebGIS可视化技术分析总结中讲解了如何把CAD的DWG格式的图纸Web可视化的方案.博文发布后,受到不少同行们的关注,也有不少咨询一些专业问题,其中大家可能疑惑 ...

  9. Python读取Excel表格

    前言:需要进行自动化办公或者自动化测试的朋友,可以了解下此文,掌握Python读取Excel表格的方法. 一.准备工作: 1.安装Python3.7.0(官网下载安装包) 2.安装Pycharm(官网 ...

  10. 重磅!微软发布 vscode.dev,把 VS Code 带入浏览器!

    早在 2019 年,当.dev顶级域名开放时,我们赶紧注册了vscode.dev.像许多购买.dev域名的人一样,我们不知道我们将用它做啥.反正,也占个坑吧! 将 VS Code 带入浏览器 直到今天 ...