题目

首先考虑到这是一张有标号的图,每一个点的地位是相等的,因此我们只需要求出一个点的价值和乘上\(n\)就好了

考虑一个点有多少种情况下度数为\(i\)

显然我们可以让除了这个点的剩下的\(n-1\)个点之间的边随便连,之后这个点从\(n-1\)个点里选择\(i\)个连边就好了,于是是\(\binom{n-1}{i}\times 2^{\frac{(n-1)(n-2)}{2}}\)种情况这个点度数为\(i\)

我们现在要做的就是这个柿子了

\[n2^{\frac{(n-1)(n-2)}{2}}\sum_{i=0}^{n-1}\binom{n-1}{i}i^k
\]

我们考虑一下展开\(i^k\),自然是用第二类斯特林数了

于是不管前面的,我们要求的东西是

\[\sum_{i=0}^{n-1}\binom{n-1}{i}\sum_{j=1}^kS_2(k,j)\times \binom{i}{j}j!
\]

我们把\(j\)放到前面来枚举

\[\sum_{j=1}^kS_2(j,k)j!\sum_{i=0}^{n-1}\binom{n-1}{i}\binom{i}{j}
\]

考虑一下\(\sum_{i=0}^{n-1} \binom{n-1}{i}\binom{i}{j}\)的组合意义,就是先从\(n-1\)里选择了\(i\)个又从\(i\)个里选择了\(j\)个,总体上看是选择了\(j\)个,是\(\binom{n-1}{j}\)种情况,但是我们只需要保证第一次选择的\(i\)完全包含\(j\),显然完全包含\(j\)的集合有\(2^{n-1-j}\)个

于是我们能把柿子写成这个样子

\[\sum_{j=1}^kS_2(k,j)\times \binom{n-1}{j}2^{n-1-j}\times j!
\]

现在的瓶颈在于求第二类斯特林数,我们记得斯特林数有一个容斥写法

\[S_2(i,j)=\frac{1}{j!}\sum_{k=0}(-1)^k\binom{j}{k}(j-k)^i
\]

我们拆开组合数之后发现这是一个卷积的形式,因此我们可以用\(NTT\)在\(O(nlogn)\)的时间内卷出一行斯特林数来

于是就解决了

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read() {
char c=getchar();int x=0;while(c<'0'||x>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const int maxn=8e5+5;
const int mod=998244353;
const int G[2]={3,332748118};
int rev[maxn],n,k,fac[maxn],inv[maxn];
int a[maxn],b[maxn],len,ifac[maxn];
inline int ksm(int a,int b) {
int S=1;
while(b) {if(b&1) S=1ll*S*a%mod;b>>=1;a=1ll*a*a%mod;}
return S;
}
inline void NTT(int *f,int o) {
for(re int i=0;i<len;i++) if(i<rev[i]) std::swap(f[i],f[rev[i]]);
for(re int i=2;i<=len;i<<=1) {
int ln=i>>1,og1=ksm(G[o],(mod-1)/i);
for(re int l=0;l<len;l+=i) {
int t,og=1;
for(re int x=l;x<l+ln;++x) {
t=1ll*og*f[x+ln]%mod;
f[x+ln]=(f[x]-t+mod)%mod;
f[x]=(f[x]+t)%mod;
og=1ll*og*og1%mod;
}
}
}
if(!o) return;
int inv=ksm(len,mod-2);
for(re int i=0;i<len;i++) f[i]=1ll*f[i]*inv%mod;
}
int main() {
n=read(),k=read();fac[0]=1,inv[1]=1;ifac[0]=1;
for(re int i=2;i<=k;i++) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
for(re int i=1;i<=k;i++) fac[i]=1ll*fac[i-1]*i%mod;
for(re int i=1;i<=k;i++) ifac[i]=1ll*ifac[i-1]*inv[i]%mod;
len=1;while(len<=k+k+2) len<<=1;
for(re int i=0;i<len;i++) rev[i]=rev[i>>1]>>1|((i&1)?len>>1:0);
for(re int i=0;i<=k;i++)
a[i]=1ll*ifac[i]*ksm(i,k)%mod;
for(re int i=0;i<=k;i++)
if(i&1) b[i]=(mod-ifac[i])%mod;else b[i]=ifac[i];
NTT(a,0),NTT(b,0);
for(re int i=0;i<len;i++) a[i]=1ll*a[i]*b[i]%mod;
NTT(a,1);
int tot=n-1,now=1,ans=0;
for(re int i=1;i<=k;i++) {
now=1ll*now*tot%mod;
tot--;if(tot<0) break;
ans=(ans+1ll*a[i]*now%mod*ksm(2,n-1-i)%mod)%mod;
}
LL t=1ll*(n-1)*(n-2)/2;t%=(mod-1);
ans=1ll*ans*n%mod;
ans=1ll*ans*ksm(2,t)%mod;
printf("%d\n",ans);
return 0;
}

最新文章

  1. 模拟CSS3 多组位移运动属性的框架封装
  2. 原创:跳坑指南——微信小程序真机预览跟本地不同的问题
  3. [转]How to open specific page in the application by clicking on the notification
  4. FIDO 标准简介
  5. Chkrootkit Sourcecode Learning
  6. 【20160924】GOCVHelper MFC增强算法(2)
  7. 用ICSharpCode.SharpZipLib进行压缩
  8. Intellij 导入play framework 项目
  9. ubuntu装机
  10. 使用Android Studio时so文件打包不到APK中
  11. 64位平台C/C++开发注意事项(转载)
  12. Android JNI programming demo with Eclipse
  13. [ACM] POJ 3254 Corn Fields(状态压缩)
  14. 再谈Java方法传参那些事
  15. 【Scala】Scala之Control Structures
  16. [Linux] Desktop Management
  17. Vue-项目打包上线
  18. P1993 小K的农场
  19. nrf52832-定时器例程
  20. model.form使用,配合form的钩子

热门文章

  1. PPT文件流转为图片,并压缩成ZIP文件输出到指定目录
  2. 服务器端事件发送SSE
  3. 在EXT框架中,使用JS文件设置UEditor文本框,出现新增内容很多,页面变型,不出现滚动条,导致无法进行操作。
  4. FI / CO 配置步骤清单
  5. linux定时任务调度定系统——opencron
  6. JMeter&#160;Sampler之BeanShellSampler的使用
  7. 原来这样就可以开发出一个百万量级的Android相机
  8. (网页)20个JS 小技巧超级实用
  9. recovery 升级&#39;@/cache/recovery/block.map&#39; failed错误问题
  10. LeetCode题解之Second Minimum Node In a Binary Tree