题目链接

对于单独一个点,我们枚举它的度数(有多少条边)来计算它的贡献:$$\sum_{i=0}{n-1}ikC_{n-1}i2{\frac{(n-2)(n-1)}{2}}$$

每个点是一样的,所以$$Ans=n\cdot 2{\frac{(n-2)(n-1)}{2}}\sum_{i=0}{n-1}C_{n-1}iik$$

考虑如何计算\(\sum_{i=0}^{n-1}C_{n-1}^ii^k\)。

然后...dalao看到\(i^k\)就想起了第二类斯特林数:

\(S(n,m)\)即在\(m\)个无区别盒子中放\(n\)个不同小球的方案数(要求盒子非空)。

\(S(n,m)\)的一个公式为$$S(n,m)=\frac{1}{m!}\sum_{k=0}m(-1)kC_mk(m-k)n$$

即利用容斥,枚举空盒子至少有多少个。因为盒子无序所以再除以\(m!\)。

而利用反演,或者是组合意义可以得到:$$mn=\sum_{k=0}mC_m^kS(n,k)k!$$

斯特林数中的盒子是无序的所以再乘个\(k!\)。

(\(\sum\)的上界是\(m\)是\(n\)都可以,看需要)

为了方便先令\(n=n-1\)。

我们把\(m^n=\sum_{k=0}^mC_m^kS(n,k)k!\)代进\(Ans\)的\(\sum\)里:$$\sum_{i=0}nC_niik=\sum_{i=0}nC_ni\sum_{j=0}iC_i^j\cdot S(k,j)\cdot j!$$

然后,还是没法做就把\(j\)放到前面枚举试试:$$\sum_{j=0}^nS(k,j)\cdot j!\cdot\sum_{i=j}nC_niC_i^j$$

考虑一下\(\sum_{i=j}^nC_n^iC_i^j\)的组合意义,即从\(n\)个物品中选任意多个(至少\(j\)个),然后从它们中再选出\(j\)个。也就是从\(n\)个中选出\(j\)个后,其余\(n-j\)个任意选的方案数,即\(C_n^j2^{n-j}\)。

所以式子还可以化成:$$\sum_{j=0}^nS(k,j)\cdot j!\cdot C_n^j\cdot 2^{n-j}$$

后面的三项\(j!\cdot C_n^j\cdot 2^{n-j}\)(\(A_n^j\cdot 2^{n-j
}\))都可以直接算,所以我们只要算\(S(k,j)\)就可以了。同BZOJ4555,把上面的$$S(n,m)=\frac{1}{m!}\sum_{k=0}m(-1)kC_mk(m-k)n$$展开成$$S(n,m)=\sum_{k=0}m\frac{(-1)k}{k!}\cdot\frac{(m-k)^n}{(m-k)!}$$

是卷积形式,就可以用\(NTT\)计算了。(\(n<k\)时\(S(n,k)=0\),所以\(j\)枚举到\(\min(n,k)\)就好了)

  1. //11060kb 11548ms
  2. #include <cstdio>
  3. #include <algorithm>
  4. #define G 3
  5. #define invG 332748118
  6. #define inv2 499122177
  7. #define mod 998244353
  8. #define Mod(x) x>=mod&&(x-=mod)
  9. #define Add(x,v) (x+=v)>=mod&&(x-=mod)
  10. #define Mul(x,y) (1ll*(x)*(y)%mod)
  11. typedef long long LL;
  12. const int N=(1<<19)+5;
  13. int fac[N],ifac[N],f[N],g[N],rev[N];
  14. inline int FP(int x,int k)
  15. {
  16. int t=1;
  17. for(; k; k>>=1,x=Mul(x,x))
  18. if(k&1) t=Mul(t,x);
  19. return t;
  20. }
  21. void NTT(int *a,int lim,int opt)
  22. {
  23. for(int i=1; i<lim; ++i) if(i<rev[i]) std::swap(a[i],a[rev[i]]);
  24. for(int i=2; i<=lim; i<<=1)
  25. {
  26. int mid=i>>1,Wn=FP(~opt?G:invG,(mod-1)/i);
  27. for(int j=0; j<lim; j+=i)
  28. for(int k=j,w=1,t; k<j+mid; ++k,w=Mul(w,Wn))
  29. a[k+mid]=a[k]-(t=Mul(w,a[k+mid]))+mod, Mod(a[k+mid]),
  30. a[k]+=t, Mod(a[k]);
  31. }
  32. if(opt==-1) for(int i=0,inv=FP(lim,mod-2); i<lim; ++i) a[i]=Mul(a[i],inv);
  33. }
  34. int main()
  35. {
  36. int n,K; scanf("%d%d",&n,&K); --n;//!
  37. int m=std::min(n,K);
  38. fac[0]=fac[1]=1, ifac[0]=ifac[1]=1;
  39. for(int i=2; i<=m; ++i) fac[i]=Mul(fac[i-1],i);
  40. ifac[m]=FP(fac[m],mod-2);
  41. for(int i=m; i; --i) ifac[i-1]=Mul(ifac[i],i);
  42. for(int i=0; i<=m; ++i) f[i]=i&1?mod-ifac[i]:ifac[i], g[i]=Mul(FP(i,K),ifac[i]);//x^K/x! (n=K)
  43. int lim=1,l=-1;
  44. while(lim<=m+m) lim<<=1,++l;
  45. for(int i=1; i<lim; ++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<l);
  46. NTT(f,lim,1), NTT(g,lim,1);
  47. for(int i=0; i<lim; ++i) f[i]=Mul(f[i],g[i]);
  48. NTT(f,lim,-1);
  49. LL ans=0; int pw2=FP(2,n),A=1;//2^{n-i} A(n,i)
  50. for(int i=0; i<=m; ++i) ans+=1ll*f[i]*A%mod*pw2%mod, pw2=Mul(pw2,inv2), A=Mul(A,n-i);
  51. printf("%lld\n",ans%mod*(n+1)%mod*FP(2,(1ll*n*(n-1)>>1ll)%(mod-1))%mod);
  52. return 0;
  53. }

BZOJ.5093.[Lydsy1711月赛]图的价值(NTT 斯特林数)的更多相关文章

  1. bzoj 5093 [Lydsy1711月赛]图的价值 NTT+第二类斯特林数

    [Lydsy1711月赛]图的价值 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 245  Solved: 128[Submit][Status][D ...

  2. BZOJ 5093: [Lydsy1711月赛]图的价值 第二类斯特林数+NTT

    定义有向图的价值为图中每一个点的度数的 \(k\) 次方之和. 求:对于 \(n\) 个点的无向图所有可能情况的图的价值之和. 遇到这种题,八成是每个点单独算贡献,然后累加起来. 我们可以枚举一个点的 ...

  3. BZOJ 5093: [Lydsy1711月赛]图的价值

    第二类斯特林数模版题 需要一些组合数的小$ trick$ upd:这里更新了本题巧妙的$ O(k)$做法,虽然常数很大就是了 传送门:here 题意:求所有$ n$个节点的无重边自环图的价值和,定义一 ...

  4. bzoj 5093 [Lydsy1711月赛]图的价值——第二类斯特林数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5093 不要见到组合数就拆! 枚举每个点的度数,则答案为 \( n*\sum\limits_{ ...

  5. 【bzoj5093】 [Lydsy1711月赛]图的价值 组合数+斯特林数+NTT

    Description "简单无向图"是指无重边.无自环的无向图(不一定连通). 一个带标号的图的价值定义为每个点度数的k次方的和. 给定n和k,请计算所有n个点的带标号的简单无向 ...

  6. BZOJ 5093[Lydsy1711月赛]图的价值 线性做法

    博主曾更过一篇复杂度为$O( k· \log k)$的多项式做法在这里 惊闻本题有$ O(k)$的神仙做法,说起神仙我就想起了于是就去学习了一波 幂与第二类斯特林数 推导看这里 $$ x^k=\sum ...

  7. 【bzoj5093】[Lydsy1711月赛]图的价值(NTT+第二类斯特林数)

    题意: 给定\(n\)个点,一个图的价值定义为所有点的度数的\(k\)次方之和. 现在计算所有\(n\)个点的简单无向图的价值之和. 思路: 将式子列出来: \[ \sum_{i=1}^n\sum_{ ...

  8. BZOJ5093 [Lydsy1711月赛]图的价值 【第二类斯特林数 + NTT】

    题目链接 BZOJ5093 题解 点之间是没有区别的,所以我们可以计算出一个点的所有贡献,然后乘上\(n\) 一个点可能向剩余的\(n - 1\)个点连边,那么就有 \[ans = 2^{{n - 1 ...

  9. bzoj5093:[Lydsy1711月赛]图的价值

    题目 首先考虑到这是一张有标号的图,每一个点的地位是相等的,因此我们只需要求出一个点的价值和乘上\(n\)就好了 考虑一个点有多少种情况下度数为\(i\) 显然我们可以让除了这个点的剩下的\(n-1\ ...

随机推荐

  1. node.js 的热更新

    1.安装 npm i supervisor -gd 2.运行 supervisor server.js //server.js 是你自己的服务的js文件

  2. Nginx详解八:Nginx基础篇之Nginx请求限制的配置语法与原理

    Nginx的请求限制: 连接频率的限制:limit_conn_module 配置语法:limit_conn_zone key zone=name:size;默认状态:-配置方法:http 配置语法:l ...

  3. JS实现继承的几种方式(转)

    转自:幻天芒的博客 前言 JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一.那么如何在JS中实现继承呢?让我们拭目以待. JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如 ...

  4. 为什么访问json接口出现文件下载

    在IE9,10,11下,当服务器端返回数据格式为json,且明确设置Content-Type为”application/json;charset=utf-8“时,会提示文件下载.如图所示: 解决办法是 ...

  5. jenkins 实现测试发布、预发布、真实发布、回滚发布

    主要思路: 1.做三个文件夹,用于放置不可随意修改的配置文件(测试发布.预发布.真实发布) 2.每次都先修改配置文件再进行构建(构建时会先把配置文件复制到构建的目录,再同步到发布的目录) 3.发布完代 ...

  6. python列表1

    List (列表)List(列表) 是 Python 中使用最 频繁的数据类 型.列表 可以 完成大 多数集 合类 的数据 结构 实现. 列表中 元素 的类型 可以 不相同 ,它支 持数 字,字 符串 ...

  7. requests之json系列(一)

    以post方式获取接口指定的相关信息 #! /usr/bin/env python # coding=utf-8 import json import urllib import requests i ...

  8. base | Thread类、ThreadData结构体 、CurrentThread命名空间

    __thread __thread是GCC内置的线程局部存储设施,存取效率可以和全局变量相比.__thread变量每一个线程有一份独立实体,各个线程的值互不干扰.可以用来修饰那些带有全局性且值可能变, ...

  9. js/jquery如何获取获取父窗口的元素

    1.$("#父窗口元素ID",window.parent.document); 对应javascript版本为 window.parent.document.getElementB ...

  10. 【bzoj3174】[Tjoi2013]拯救小矮人

    题解: 这题非常容易想到一个错误的贪心 就是按照ai排序 然后尽量取ai小的 但是有很明显的问题就是如果取了小的ai 那会导致那些原本可能存在这些ai就可以去掉的大的人因此不能取了 而有可能可以先去取 ...