两树相同的定义与题中相同,并定义两树完全相同当且仅当在不允许基环旋转的条件下相同

枚举基环的长度$l$,根据置换群的理论,答案即$\frac{1}{l}\sum_{i=1}^{l}f(i)$(其中$f(i)$表示满足"基环旋转$i$次后与原基环树完全相同"的不完全相同的树个数)

关于这个结论,考虑一棵树将基环旋转$1,2,...,l$次的$l$棵树(这$l$棵树相同),其中每一种不完全相同的树的贡献即其中与其完全相同的树个数,那么所有树总贡献即为$l$,因此除以$l$后即为答案

不难发现$f(i)$仅取决于$\gcd(l,i)$,不妨枚举后者,答案即$\frac{1}{l}\sum_{d\mid l}\varphi(\frac{l}{d})f(d)$

为了方便,我们枚举$\frac{l}{d}$,答案即$\frac{1}{l}\sum_{d\mid l}\varphi(d)f(\frac{l}{d})$

考虑$f(\frac{l}{d})$,即统计有多少组树$(T_{1},T_{2},...,T_{\frac{l}{d}})$(不允许为空),使得其点数和为$\frac{n}{d}$(若$d\not\mid n$即无解),两组树不同当且仅当满足$\exists 1\le i\le d,T_{i}$和$T'_{i}$不同

关于这个问题,显然形态和染色独立,分别考虑:

考虑$n$个点不同形态的树有多少棵,即长为$n-1$的括号序列数(注意首尾的两个括号为根,必须要匹配),也即$C_{n-1}$(其中$C_{n}$为卡特兰数第$n$项,有$C_{n}=\frac{{2n\choose n}}{n+1}$)

令$C(x)$为$C_{n-1}$的生成函数,即$C(x)=\sum_{n\ge 1}C_{n-1}x^{n}$,那么方案数即$[x^{\frac{n}{d}}]C^{\frac{l}{d}}(x)$

考虑染色数,若$\forall 1\le i\le m,d\mid a_{i}$则方案数为$\frac{\frac{n}{d}!}{\prod_{i=1}^{m}\frac{a_{i}}{d}!}$,否则为0

综上,最终答案即
$$
\sum_{l=2}^{n}\frac{1}{l}\sum_{d\mid \gcd(l,g)}\varphi(d)\cdot [x^{\frac{n}{d}}]C^{\frac{l}{d}}(x)\cdot\frac{\frac{n}{d}!}{\prod_{i=1}^{m}\frac{a_{i}}{d}!}
$$
(其中$g=\gcd(a_{1},a_{2},...,a_{m})$,显然此时$g\mid n$)

交换枚举顺序,即
$$
\left(\sum_{d\mid g}\frac{\varphi(d)}{d}\cdot \frac{\frac{n}{d}!}{\prod_{i=1}^{m}\frac{a_{i}}{d}!}\sum_{l=1}^{\frac{n}{d}}\frac{[x^{\frac{n}{d}}]C^{l}(x)}{l} \right)-C_{n-1} \frac{n!}{\prod_{i=1}^{m}a_{i}!}
$$
(注意要减去$l=1$的情况)

对于这些式子,除了$\sum_{l=1}^{\lfloor\frac{n}{d}\rfloor}\frac{[x^{\frac{n}{d}}]C^{l}(x)}{l}$都可以快速计算($\frac{\frac{n}{d}!}{\prod_{i=1}^{m}\frac{a_{i}}{d}!}$暴力即可,复杂度为$o(\sigma(g)m)$)

对于$\sum_{l=1}^{\lfloor\frac{n}{d}\rfloor}\frac{[x^{\frac{n}{d}}]C^{l}(x)}{l}$,注意到都是$[x^{\frac{n}{d}}]$,不妨先将多项式求和,即求$[x^{\frac{n}{d}}]\sum_{l=1}^{\frac{n}{d}}\frac{C^{l}(x)}{l}$

关于后者,由于$C(x)$的最低次为1,因此不妨删去$l$的上限,即求$[x^{\frac{n}{d}}]\sum_{l\ge 1}\frac{C^{l}}{l}$

关于右半部分,也即$-\ln (1-C)$,证明考虑$f(x)=\ln x$在1处的泰勒展开,即
$$
f(x)=\sum_{i\ge 0}\frac{(x-1)^{i}f^{(i)}(1)}{i!}=-\sum_{i\ge 1}\frac{(x-1)^{i}\frac{(i-1)!}{(-1)^{i}}}{i!}=-\sum_{i\ge 1}\frac{(1-x)^{i}}{i}
$$
(其中$f^{(i)}(x)$指$f$的$i$阶导数,计算并归纳可以发现其为$-\frac{(i-1)!}{(-x)^{i}}$)

不难得到$-\ln(1-C)=\sum_{i\ge 1}\frac{C^{i}(x)}{i}$,即得证

由此,多项式求对数即可,时间复杂度为$o(\sigma(g)m+n\log n)$,可以通过

事实上,令$C_{0}(x)=\frac{C(x)}{x}=\sum_{n\ge 0}C_{n}x^{n}$,那么有通项公式
$$
[x^{n}]C_{0}^{m}(x)={2n+m-1\choose n}-{2n+m-1\choose n-1}
$$

关于这个式子的解释——

$[x^{n}]C_{0}^{m}(x)$实际上可以看作从$(0,0)$走到$(2n,0)$,要求每一步从$(x,y)$到$(x+1,y\pm 1)$,求所有与$y=-1$不交的路径贡献和,其中一条路径的贡献为${tot\choose m-1}$($tot$为该路径除起点和终点外与$x$轴的交点数)

事实上,这也等价于从$(0,0)$走到$(2n+m-1,1-m)$且与$y=-m$不交的路径数

关于两者的对应关系:

考虑前者路径,不断将其路径上与$y=0,-1,...,2-m$的某一个交点之后新增一步到$(x+1,y-1)$,即得到一条后者的路径,并且显然选择方式恰有${tot\choose m-1}$种

考虑后者的路径,分别将其路径上与$y=-1,-2,...,1-m$的第一次交点取出,显然这些交点的上一个步都是从$(x-1,y+1)$到$(x,y)$,删去这些步,即得到前者的路径

后者的路径数是一个经典的问题,在没有"与$y=-m$不交"的条件下,方案数显然为${2n+m-1\choose n-m}$,接下来考虑减去"与$y=-m$有交"的路径数,而这也等价于从$(0,-2m)$走到$(2n+m-1,1-m)$的路径数

关于两者的对应关系:显然两者的路径都与$y=-m$有交,那么将两者路径上第一次与$y=-m$相交之前的部分以$y=-m$为对称轴翻折,即可得到另一者的路径

后者的路径数显然为${2n+m-1\choose n-m-1}$(注意少向下一步还会多向上一步),即得证

类似地,可以得到
$$
[x^{n}]C^{m}(x)=[x^{n-m}]C_{0}^{m}(x)={2n-m-1\choose n-m}-{2n-m-1\choose n-m-1}
$$
由此,回到"交换枚举顺序"后的式子,直接使用通项公式计算即可

时间复杂度同样为$o(\sigma(g)m+n\log n)$,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 #define mod 998244353
5 #define ll long long
6 int n,m,g,ans,a[N],fac[N<<1],inv[N<<1],Inv[N<<1],p[N],vis[N],phi[N];
7 int gcd(int x,int y){
8 if (!y)return x;
9 return gcd(y,x%y);
10 }
11 int c(int n,int m){
12 if ((m<0)||(m>n))return 0;
13 return (ll)fac[n]*Inv[m]%mod*Inv[n-m]%mod;
14 }
15 int C(int n,int m){
16 return (c(2*n-m-1,n-m)-c(2*n-m-1,n-m-1)+mod)%mod;
17 }
18 int C(int n){
19 return (ll)c((n<<1),n)*inv[n+1]%mod;
20 }
21 int main(){
22 fac[0]=inv[0]=inv[1]=Inv[0]=1;
23 for(int i=1;i<(N<<1);i++)fac[i]=(ll)fac[i-1]*i%mod;
24 for(int i=2;i<(N<<1);i++)inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
25 for(int i=1;i<(N<<1);i++)Inv[i]=(ll)Inv[i-1]*inv[i]%mod;
26 phi[1]=1;
27 for(int i=2;i<N;i++){
28 if (!vis[i]){
29 p[++p[0]]=i;
30 phi[i]=i-1;
31 }
32 for(int j=1;(j<=p[0])&&(i*p[j]<N);j++){
33 vis[i*p[j]]=1;
34 if (i%p[j])phi[i*p[j]]=phi[i]*phi[p[j]];
35 else{
36 phi[i*p[j]]=phi[i]*p[j];
37 break;
38 }
39 }
40 }
41 scanf("%d%d",&n,&m);
42 g=n,ans=mod-(ll)C(n-1)*fac[n]%mod;
43 for(int i=1;i<=m;i++){
44 scanf("%d",&a[i]);
45 g=gcd(g,a[i]);
46 ans=(ll)ans*Inv[a[i]]%mod;
47 }
48 for(int i=1;i<=g;i++)
49 if (g%i==0){
50 int s=0;
51 for(int j=1;j<=n/i;j++)s=(s+(ll)C(n/i,j)*inv[j])%mod;
52 s=(ll)s*fac[n/i]%mod;
53 for(int j=1;j<=m;j++)s=(ll)s*Inv[a[j]/i]%mod;
54 ans=(ans+(ll)s*phi[i]%mod*inv[i])%mod;
55 }
56 printf("%d",ans);
57 }

[luogu5564]Say Goodbye的更多相关文章

  1. Codeforces Goodbye 2018

    Goodbye 2018 可能是我太菜考试的时候出不了$E$ 可能是我太菜考试的时候调不出$F$ 所以转化为手速场之后手速还上不去.jpg A 模拟题意... #include <cstdio& ...

  2. [T-ARA][Goodbye, OK]

    歌词来源:http://music.163.com/#/song?id=22704437 作曲 : 안영민 , 이유진 [作曲 : a-nyeong-min , i-yu-jin] 作词 : 안영민 ...

  3. UVA 11534 - Say Goodbye to Tic-Tac-Toe(博弈sg函数)

    UVA 11534 - Say Goodbye to Tic-Tac-Toe 题目链接 题意:给定一个序列,轮流放XO,要求不能有连续的XX或OO.最后一个放的人赢.问谁赢 思路:sg函数.每一段.. ...

  4. Saying Good-bye to Cambridge Again

    Saying Good-bye to Cambridge Again Very quietly I take my leave,      As quietly as I came here;     ...

  5. [新概念英语] Lesson 12 : GOODBYE AND GOOD LUCK

    Lesson 12 : GOODBYE AND GOOD LUCK New words and expressions : luck (n) 运气 例句 You're not having much ...

  6. The Last Goodbye 电影《霍比特人3:五军之战》插曲

    https://music.163.com/#/song?id=29755223 I saw the light fade from the sky我看到天空褪去色彩On the wind I hea ...

  7. 跨域跨域跨域,从此say goodbye

    跨域这个问题每个开发者都会遇到,只是时间先后而已,你不搞清楚它他就像狗皮膏药一样粘着你,在你求职生涯中不停的遇到,然后你每次都要做这个功课,终于有一天这个名词已经让我忍无可忍了,下定决心必须搞定它,要 ...

  8. UOJ Contest #50: Goodbye Jihai

    比赛传送门:Goodbye Jihai. \(\Huge{\mathbf{再见,己亥.\\你好,庚子!\\祝大家新春快乐!}}\) A. 新年的促销 这题如果直接做的话可能方向会想歪,方向对了其实就是 ...

  9. maven install报The forked VM terminated without saying properly goodbye. VM crash or System.exit called

    idea新导入的工程maven install打包报错误:The forked VM terminated without saying properly goodbye. VM crash or S ...

随机推荐

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

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

  2. Spatial Analyst 工具-数学分析

    数学分析 # Process: Abs arcpy.gp.Abs_sa("", 输出栅格) # Process: Exp arcpy.gp.Exp_sa("", ...

  3. Git学习笔记03-原理

    在Git中,算上远程Git仓库有四个工作区域 Git本地有三个区域(工作区域.暂存区,资源区,远程Git仓库) 工作区域:就是你本机写好的代码,你可以看到的 暂存区:你写好的代码上传后被git管理的内 ...

  4. NOIP 模拟 七十七

    100+60+95+30; T4 一个变量打错挂了40.. T1 最大或 考虑从高到低枚举的二进制位,然后和的对应二进制位进行比较.如果两 者相同,那么不论怎么选择,,答案在这个位置上的值一定和在这个 ...

  5. flask 之 请求钩子

    请求钩子 什么是请求钩子? 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要统一处理,为了让每个视图函数避免编写重复功能的代码,flask提供了统一的接口可以添加这些处理函数,即请求钩子. f ...

  6. 剑指offer:JZ8 二叉树的下一个结点

    JZ8 二叉树的下一个结点 描述 给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针.下图为一棵有9个节点的二叉 ...

  7. Coursera Deep Learning笔记 改善深层神经网络:超参数调试 Batch归一化 Softmax

    摘抄:https://xienaoban.github.io/posts/2106.html 1. 调试(Tuning) 超参数 取值 #学习速率:\(\alpha\) Momentum:\(\bet ...

  8. [no_code][Beta]设计和计划

    2020春季计算机学院软件工程(罗杰 任健) 2020春季计算机学院软件工程(罗杰 任健) 作业要求 Beta设计和计划 我们在这个课程的目标是 远程协同工作,采用最新技术开发软件 这个作业在哪个具体 ...

  9. 第五次Scrum Metting

    日期:2021年5月2日 会议主要内容概述:讨论前端进度,修改后端接口. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 模板模块的实现及批量插入更 ...

  10. activiti会签 多实例例子

    在实际的业务中,可能存在存在这么一种情况,当流程运行到某一个环节时,可能需要同时多个人的参与,才可以完成此环节.此时就可以用到activiti的多实例来解决此问题. 一.将一个节点设置成多实例的方法: ...