[luogu5564]Say Goodbye
两树相同的定义与题中相同,并定义两树完全相同当且仅当在不允许基环旋转的条件下相同
枚举基环的长度$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的更多相关文章
- Codeforces Goodbye 2018
Goodbye 2018 可能是我太菜考试的时候出不了$E$ 可能是我太菜考试的时候调不出$F$ 所以转化为手速场之后手速还上不去.jpg A 模拟题意... #include <cstdio& ...
- [T-ARA][Goodbye, OK]
歌词来源:http://music.163.com/#/song?id=22704437 作曲 : 안영민 , 이유진 [作曲 : a-nyeong-min , i-yu-jin] 作词 : 안영민 ...
- UVA 11534 - Say Goodbye to Tic-Tac-Toe(博弈sg函数)
UVA 11534 - Say Goodbye to Tic-Tac-Toe 题目链接 题意:给定一个序列,轮流放XO,要求不能有连续的XX或OO.最后一个放的人赢.问谁赢 思路:sg函数.每一段.. ...
- Saying Good-bye to Cambridge Again
Saying Good-bye to Cambridge Again Very quietly I take my leave, As quietly as I came here; ...
- [新概念英语] Lesson 12 : GOODBYE AND GOOD LUCK
Lesson 12 : GOODBYE AND GOOD LUCK New words and expressions : luck (n) 运气 例句 You're not having much ...
- The Last Goodbye 电影《霍比特人3:五军之战》插曲
https://music.163.com/#/song?id=29755223 I saw the light fade from the sky我看到天空褪去色彩On the wind I hea ...
- 跨域跨域跨域,从此say goodbye
跨域这个问题每个开发者都会遇到,只是时间先后而已,你不搞清楚它他就像狗皮膏药一样粘着你,在你求职生涯中不停的遇到,然后你每次都要做这个功课,终于有一天这个名词已经让我忍无可忍了,下定决心必须搞定它,要 ...
- UOJ Contest #50: Goodbye Jihai
比赛传送门:Goodbye Jihai. \(\Huge{\mathbf{再见,己亥.\\你好,庚子!\\祝大家新春快乐!}}\) A. 新年的促销 这题如果直接做的话可能方向会想歪,方向对了其实就是 ...
- 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 ...
随机推荐
- 树莓派3B搭建NODE-RED运行环境并构建数据流
树莓派3B搭建NODE-RED运行环境并构建数据流 树莓派搭建Node-RED环境 树莓派自2015年开始是默认就带NODE-RED的,但是如今已是2018年:)自带的版本已经很老了,可通过下面的命令 ...
- Android应用开发特色
目录 Android应用开发特色 四大组件 Activity Service Broadcastreceiver Contentprovider 丰富的系统控件 Sqlite数据库 强大的多媒体 An ...
- 常用SQL函数大全
数学函数 mod(x,y) 返回x/y的模(余数)mod(5,3)=2,mod(3,5)=3 floor(x) 返回小于x的最大整数值ceiling(3)=3,ceiling(3.1)=3 cei ...
- 内网渗透DC-5靶场通关
个人博客地址:点我 DC系列共9个靶场,本次来试玩一下一个 DC-5,只有一个flag,下载地址. 下载下来后是 .ova 格式,建议使用vitualbox进行搭建,vmware可能存在兼容性问题.靶 ...
- HashMap、ConcurrentHashMap红黑树实现分析
本文学习知识点 1.二叉查找树,以及二叉树查找带来的问题. 2.平衡二叉树及好处. 3.红黑树的定义及构造. 4.ConcurrentHashMap中红黑树的构造. 在正式分析红黑树之前,有必要了解红 ...
- 如何快速体验鸿蒙全新声明式UI框架ArkUI?
HDC2021将于10月22日在东莞松山湖正式开幕,大会将设立Codelab体验专区,超多好玩.有趣的Demo等你体验.想快速入门HarmonyOS?学习HarmonyOS新特性?以下几个Codela ...
- javascript-jquery对象的属性处理
1.attr()方法:获取元素某个属性的值. $("img").attr("title");//获得第一个<img>元素的title属性 $(&qu ...
- 第四代富士X100F操作学习
前言 本文为自己通过B站的UP主[阿布垃机手册]整理.原视频地址:[阿布垃机手册][布瞎BB]富士 X100F 相机外部按键 拍人像自己的设置 [X100F相机光圈大小支持F2到F16+Auto]光圈 ...
- vue3.x异步组件
在大型应用中,我们可能需要将应用分割成小一些的代码块,并且只在需要的时候才从服务器加载一个模块 vue2.x 曾经简单的异步组件 components: { AsyncComponent: () =& ...
- 第五次Scrum Metting
日期:2021年5月2日 会议主要内容概述:讨论前端进度,修改后端接口. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 模板模块的实现及批量插入更 ...