「LOJ6570 毛毛虫计数」 - 生成函数

news/2024/10/17 12:19:07/

LOJ6570 毛毛虫计数

tags:生成函数,多项式

题意

hsezoi 巨佬 olinr 喜欢 van 毛毛虫,他定义毛毛虫是一棵树,满足树上存在一条树链,使得树上所有点到这条树链的距离最多为 \(1\)。给定 \(n\) \((n\le10^5)\) 。现在请你求出 \(n\) 个点、有标号的毛毛虫的数量。答案对 \(998244353\) 取模。

题解

构造生成函数

对于毛毛虫直径中间的一个节点,大小为 i 总共有 i 种放法,指数型生成函数是

\[ A(x)=\sum_{i=1}^\infty\frac{ix^i}{i!} \]

对于与直径两端点相连的一个节点,强制至少挂一个节点,指数型生成函数是

\[ B(x)=\sum_{i=2}^\infty\frac{ix^i}{i!} \]

然后结果就是 \((A(x)^0+A(x)^1+\cdots)B(x)^2=\frac {B(x)^2}{1-A(x)}\)

输出:

\[ \frac{n!}2[x^n]\frac {B(x)^2}{1-A(x)} \]

注意要特判 n = 2

顺便放下我的多项式板子,需要的时候可以拉

#include<cstdio>
#include<vector>
//#define debug(...) fprintf(stderr,__VA_ARGS__)
#define debug(...) ((void)0)
typedef std::vector<int> poly;
const int P=998244353;
int fpow(int a,int b){int res=1;for(;b;b>>=1,a=1ll*a*a%P)if(b&1)res=1ll*res*a%P;return res;} 
void pt(const poly&a){for(int i=0;i<(int)a.size();++i)debug("%d ",a[i]);debug("\n");}
int getlim(int n){int x=1;while(x<=n)x<<=1;return x;}
void ntt(poly&a,int g,int lim){a.resize(lim);for(int i=0,j=0;i<lim;++i){if(i<j)std::swap(a[i],a[j]);for(int k=lim>>1;(j^=k)<k;k>>=1);}poly w(lim>>1);w[0]=1;for(int i=1;i<lim;i<<=1){for(int j=1,wn=fpow(g,(P-1)/(i<<1));j<i;++j)w[j]=1ll*w[j-1]*wn%P;for(int j=0;j<lim;j+=i<<1)for(int k=0;k<i;++k){int x=a[j+k],y=1ll*a[i+j+k]*w[k]%P;a[j+k]=(x+y)%P,a[i+j+k]=(x-y+P)%P;}}if(g==332748118)for(int i=0,I=fpow(lim,P-2);i<(int)a.size();++i)a[i]=1ll*a[i]*I%P;
}
poly pmul(poly a,poly b){int need=(int)a.size()+b.size()-1,lim=getlim(need);ntt(a,3,lim),ntt(b,3,lim);for(int i=0;i<lim;++i)a[i]=1ll*a[i]*b[i]%P;ntt(a,332748118,lim);return a.resize(need),a;
}
poly padd(poly a,poly b){if(a.size()<b.size()){for(int i=0;i<(int)a.size();++i)(b[i]+=a[i])%=P;return b;}else{for(int i=0;i<(int)b.size();++i)(a[i]+=b[i])%=P; return a;}
}
poly pinv(const poly&a,int n=-1){if(n==-1)n=a.size();if(n==1)return poly(1,fpow(a[0],P-2));poly b=pinv(a,(n+1)>>1),tmp=poly(a.begin(),a.begin()+n);int lim=getlim(n*2-2);ntt(b,3,lim),ntt(tmp,3,lim);for(int i=0;i<lim;++i)b[i]=(2-1ll*b[i]*tmp[i]%P+P)%P*b[i]%P;ntt(b,332748118,lim);return b.resize(n),b;
}
poly pdao(const poly&a){poly b((int)a.size()-1);for(int i=1;i<(int)a.size();++i)b[i-1]=1ll*a[i]*i%P;return b;
}
poly pji(const poly&a){poly b((int)a.size()+1);for(int i=0;i<(int)a.size();++i)b[i+1]=1ll*a[i]*fpow(i+1,P-2)%P;return b;
}
poly pln(const poly&a){poly b(pmul(pdao(a),pinv(a)));b.resize((int)a.size()-1);return pji(b);
}
poly pexp(const poly&a,int n=-1){if(n==-1)n=a.size();if(n==1)return poly(1,1);poly b=pexp(a,(n+1)>>1),c(b);c.resize(n),c=pln(c),--c[0];for(int i=0;i<n;++i)c[i]=(a[i]-c[i]+P)%P;poly d(pmul(b,c));return d.resize(n),d;
}
const int N=100005;
int n,fac[N],inv[N];
int main(){fac[0]=fac[1]=inv[0]=inv[1]=1;for(int i=2;i<N;++i)fac[i]=1ll*fac[i-1]*i%P,inv[i]=1ll*(P-P/i)*inv[P%i]%P;for(int i=2;i<N;++i)inv[i]=1ll*inv[i]*inv[i-1]%P;scanf("%d",&n);if(n<=2)return puts("1"),0;poly A(n+1),B(n+1);A[0]=1;for(int i=1;i<=n;++i)A[i]=(P-1ll*i*inv[i]%P)%P;for(int i=2;i<=n;++i)B[i]=1ll*i*inv[i]%P;A=pinv(A),B=pmul(B,B),B.resize(n+1),A=pmul(A,B),A.resize(n+1);printf("%lld\n",(n+1ll*A[n]*fac[n]%P*((P+1)>>1)%P)%P);return 0;
}

转载于:https://www.cnblogs.com/xay5421/p/LOJ6570.html


http://www.ppmy.cn/news/178022.html

相关文章

HDU 6570 Wave dp

题意&#xff1a;给出一个长度为n的数列 和一个c 数列的所有数都在c范围内 问&#xff1a; 求一个最长子串 满足下列条件&#xff1a; 1 所有奇数位置的数相等 2 所有偶数位置的数相等 3 偶数位置和奇数位置的数不相等 比赛的时候枚举c 然后二分查找n o( c^2 logn ) 78…

D - Wave HDU - 6570

暴力求解 Avin is studying series. A series is called “wave” if the following conditions are satisfied: It contains at least two elements;All elements at odd positions are the same;All elements at even positions are the same;Elements at odd positions are…

GPT(4kb硬盘) 单硬盘装变色龙、GA-H61MA-D2V、ALC887-VD、HD6570成功驱动经验(转)

GPT(4kb硬盘) 单硬盘装变色龙、GA-H61MA-D2V、ALC887-VD、HD6570成功驱动经验 2012-08-21 11:32:17 分类&#xff1a; 系统运维 终于用上黑苹果了&#xff0c;所以决定把这近一个月付出辛劳总结归纳一下&#xff0c;以后也记得操作步骤。基础的就不会详细写&#xff0c;要注意或…

MT6570_MT6580参考设计资料介绍

MT6570_MT6580参考设计资料介绍&#xff1a; MT6570_MT6580 Introduction ▪ GPIO and IO application ▪ System dependent design ▪ Power introduction Function design notice ▪ SIM design note (3/4-SIM application) ▪ NAND flash design note ▪ SD/eMMC design not…

HDU - 6570

题目链接&#xff1a;HDU - 6570 暴力的话就是枚举两种颜色&#xff0c;然后暴力求。因为不可能每一种情况都跑满&#xff0c;均摊下来感觉复杂度是&#xff1a;O(ccsqrt(n))。 事实上我们可以O(n*c)dp&#xff0c;令dp[i][j][k] 为&#xff1a;第i项为k&#xff0c;前面的一个…

AMD显卡更新UEFI GOP

一、简介 很多老版本显卡vBIOS仅支持leagcy&#xff0c;所以在UEFI版本的BIOS下不能显示&#xff0c;本文以HD6570其中一款显卡进行操作。 二、操作步骤 2.1 操作环境 windows操作系统GPU-Z 下载地址NV或者AMD显卡BIOS的刷新工具NVFlash或者ATIFlash下载地址制作给显卡BIOS…

MT6572/MT6570芯片资料介绍,MT6572+MT6570处理器

MT6572处理器&#xff1a; 联发科MT6572 可在不损电池使用时间的情况下&#xff0c;为入门级智能型手机提供双核心效能表现。它配备节能的双核心ARM Cortex-A7 处理器&#xff0c;并采用优化了成本效益的系统级设计&#xff0c;简化了产品研发工序&#xff0c;从而降低生产成本…

3D建模新手入门到高端 电脑配置一览

入门机&#xff1a;1000元到3500元中端主流机&#xff1a;4000元到6000元高端机&#xff1a;6000元到10000元 1、1550元方案 方案说明 AMD3200G的CPU性能接近i3 9100F&#xff0c;不过核显是强大的Vega 8&#xff0c;核心频率达到1250MHz&#xff0c;可媲美入门独立显卡&…