【2016NOI十连赛2-2】黑暗

题目大意:定义一个无向图的权值为连通块个数的\(m\)次方。求\(n\)个点的所有无向图的权值和。多次询问。

数据范围:\(T\leq 1000,n\leq 30000,m\leq 15\)

我们使用用第二类斯特林数转换\(n^m\)。

\[n^m=\sum_{i=0}^m\binom{n}{i}i!\begin{Bmatrix}m\\i\end{Bmatrix}
\]

我们观察这个式子,相当于在\(n\)个连通块中选一个大小为\(i\)的子集,其贡献为\(i!\begin{Bmatrix}m\\i\end{Bmatrix}\)

我们设\(f_n\)表示\(n\)个点的无向连通图的数量,\(g_{n,m}\)表示\(n\)个点,\(m\)个连通块的数量。则答案为:

\[\sum_{j=1}^mj!\begin{Bmatrix}m\\j\end{Bmatrix}\sum_{i=j}^ng_{i,j}\binom{n}{i}2^{\binom{n-i}{2}}
\]

设\(A(x)=\sum \frac{2^{\binom{i}{2}}}{i!}x^i\),也就是无向图的\(OGF\)。设\(F(x)=\sum \frac{f_i}{i!}\)。

因为:

\[A(x)=\sum_{i}\frac{F(x)^i}{i}=\exp(F(x))\\
\]

所以:

\[\Rightarrow F(x)=\ln(A(x))
\]

代码:

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define N 30005
  4. using namespace std;
  5. inline int Get() {
  6. int x=0,f=1;
  7. char ch=getchar();
  8. while(ch<'0'||ch>'9') {
  9. if(ch=='-') f=-1;
  10. ch=getchar();
  11. }
  12. while('0'<=ch&&ch<='9') {
  13. x=(x<<1)+(x<<3)+ch-'0';
  14. ch=getchar();
  15. }
  16. return x*f;
  17. }
  18. const ll mod=998244353;
  19. ll ksm(ll t,ll x) {
  20. ll ans=1;
  21. for(;x;x>>=1,t=t*t%mod)
  22. if(x&1) ans=ans*t%mod;
  23. return ans;
  24. }
  25. int n,m;
  26. void NTT(ll *a,int d,int flag) {
  27. static int rev[N<<2];
  28. static ll G=3;
  29. int n=1<<d;
  30. for(int i=0;i<n;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<d-1);
  31. for(int i=0;i<n;i++) if(i<rev[i]) swap(a[i],a[rev[i]]);
  32. for(int s=1;s<=d;s++) {
  33. int len=1<<s,mid=len>>1;
  34. ll w=flag==1?ksm(G,(mod-1)/len):ksm(G,mod-1-(mod-1)/len);
  35. for(int i=0;i<n;i+=len) {
  36. ll t=1;
  37. for(int j=0;j<mid;j++) {
  38. ll u=a[i+j],v=a[i+j+mid]*t%mod;
  39. a[i+j]=(u+v)%mod;
  40. a[i+j+mid]=(u-v+mod)%mod;
  41. t=t*w%mod;
  42. }
  43. }
  44. }
  45. if(flag==-1) {
  46. ll inv=ksm(n,mod-2);
  47. for(int i=0;i<n;i++) a[i]=a[i]*inv%mod;
  48. }
  49. }
  50. void Inv(ll *inv,int d,ll *a) {
  51. static ll A[N<<2];
  52. if(d==0) {
  53. inv[0]=ksm(a[0],mod-2);
  54. return ;
  55. }
  56. Inv(inv,d-1,a);
  57. for(int i=1<<d;i<1<<d+1;i++) A[i]=inv[i]=0;
  58. for(int i=0;i<1<<d;i++) A[i]=a[i];
  59. NTT(inv,d+1,1),NTT(A,d+1,1);
  60. for(int i=0;i<1<<d+1;i++) inv[i]=(2*inv[i]-A[i]*inv[i]%mod*inv[i]%mod+mod)%mod;
  61. NTT(inv,d+1,-1);
  62. for(int i=1<<d;i<1<<d+1;i++) inv[i]=0;
  63. }
  64. void Int(ll *f,int d) {
  65. int n=1<<d;
  66. for(int i=0;i<n-1;i++) f[i]=f[i+1]*(i+1)%mod;
  67. f[n-1]=0;
  68. }
  69. void Der(ll *f,int d) {
  70. int n=1<<d;
  71. for(int i=n-1;i>0;i--) f[i]=f[i-1]*ksm(i,mod-2)%mod;
  72. f[0]=0;
  73. }
  74. void Ln(ll *ln,int d,ll *a) {
  75. static ll inv[N<<2],f[N<<2];
  76. for(int i=0;i<1<<d+1;i++) inv[i]=f[i]=0;
  77. for(int i=0;i<1<<d;i++) f[i]=a[i];
  78. Inv(inv,d,a);
  79. Int(f,d);
  80. NTT(inv,d+1,1),NTT(f,d+1,1);
  81. for(int i=0;i<1<<d+1;i++) f[i]=f[i]*inv[i]%mod;
  82. NTT(f,d+1,-1);
  83. Der(f,d);
  84. for(int i=0;i<1<<d;i++) ln[i]=f[i];
  85. }
  86. ll fac[N],ifac[N];
  87. ll S[20][20];
  88. ll e[N];
  89. ll C(int n,int m) {return fac[n]*ifac[m]%mod*ifac[n-m]%mod;}
  90. void pre(int n,int m) {
  91. for(int i=0;i<=n;i++) e[i]=ksm(2,i*(i-1)/2);
  92. fac[0]=1;
  93. for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
  94. ifac[n]=ksm(fac[n],mod-2);
  95. for(int i=n-1;i>=0;i--) ifac[i]=ifac[i+1]*(i+1)%mod;
  96. S[0][0]=1;
  97. for(int i=1;i<=m;i++)
  98. for(int j=1;j<=i;j++)
  99. S[i][j]=(S[i-1][j-1]+j*S[i-1][j])%mod;
  100. }
  101. ll f[N<<2],g[20][N<<2];
  102. ll F[20][N];
  103. void DP(int n,int m) {
  104. static ll tem[N<<2];
  105. static ll A[N<<2],B[N<<2];
  106. for(int i=0;i<=n;i++) {
  107. tem[i]=e[i]*ifac[i]%mod;
  108. }
  109. int d=ceil(log2(n+1));
  110. Ln(f,d,tem);
  111. for(int i=1;i<=n;i++) {
  112. f[i]=f[i]*fac[i]%mod*ifac[i-1]%mod;
  113. }
  114. NTT(f,d+1,1);
  115. g[0][0]=1;
  116. for(int j=1;j<=m;j++) {
  117. for(int i=0;i<=n;i++) g[j][i]=g[j-1][i]*ifac[i]%mod;
  118. NTT(g[j],d+1,1);
  119. for(int i=0;i<1<<d+1;i++) g[j][i]=g[j][i]*f[i]%mod;
  120. NTT(g[j],d+1,-1);
  121. for(int i=n+1;i<1<<d+1;i++) g[j][i]=0;
  122. for(int i=1;i<=n;i++) g[j][i]=g[j][i]*fac[i-1]%mod;
  123. }
  124. for(int i=0;i<=n;i++) B[i]=e[i]*ifac[i]%mod;
  125. NTT(B,d+1,1);
  126. for(int j=1;j<=m;j++) {
  127. for(int i=0;i<1<<d+1;i++) A[i]=0;
  128. for(int i=1;i<=n;i++) A[i]=g[j][i]*ifac[i]%mod;
  129. NTT(A,d+1,1);
  130. for(int i=0;i<1<<d+1;i++) A[i]=A[i]*B[i]%mod;
  131. NTT(A,d+1,-1);
  132. for(int i=1;i<=n;i++) F[j][i]=A[i]*fac[i]%mod;
  133. }
  134. }
  135. int main() {
  136. pre(30000,15);
  137. DP(30000,15);
  138. int T=Get();
  139. while(T--) {
  140. n=Get(),m=Get();
  141. ll ans=0;
  142. for(int j=1;j<=m;j++) {
  143. ll res=0;
  144. (ans+=F[j][n]*fac[j]%mod*S[m][j])%=mod;
  145. }
  146. cout<<ans<<"\n";
  147. }
  148. return 0;
  149. }

【2016NOI十连赛2-2】黑暗的更多相关文章

  1. 【CJOJ P1957】【NOIP2010冲刺十模拟赛】数字积木

    [NOIP2010冲刺十模拟赛]数字积木 Description 小明有一款新式积木,每个积木上都有一个数,一天小明突发奇想,要是把所有的积木排成一排,所形成的数目最大是多少呢? 你的任务就是读入n个 ...

  2. C#和ASP.Net面试题目集锦

    1.有哪几种方法可以实现一个类存取另外一个类的成员函数及属性,并请举列来加以说明和分析.2.A类是B类的基类,并且都有自己的构造,析构函数,请举例证明B类从实例化到消亡过程中构造,析构函数的执行过程. ...

  3. .net面式题

    .Net httphandler与httpmodule区别 动态控件在postback能否保存下来(不能) 序列化(对象到其他格式(xml/json/byte...)JavaScriptSeriali ...

  4. 第十届蓝桥杯省赛JavaB组个人题解

    前言 以下的第十届蓝桥杯Java B组省赛的题目题解只是我个人的题解,提供一些解题思路,仅作参考,如有错误,望大家指出,不甚感激,我会及时更改. 试题 A: 组队 ----- 答案:490 [问题描述 ...

  5. 惨痛第十届蓝桥杯总结(附录蓝桥省赛知识点总结)-C++ B组

    虽然目前距离蓝桥省赛仅仅过去一天但昨天下午和大神对答案的感觉依旧..... 现在深刻里理解到了为啥大神老是说咱们蓝桥叫 阅读理解杯(现在我非常认同这种说法啊...) 虽然第一次参加,赛前紧张提前30分 ...

  6. Minieye杯第十五届华中科技大学程序设计邀请赛现场同步赛 I Matrix Again

    Minieye杯第十五届华中科技大学程序设计邀请赛现场同步赛 I Matrix Again https://ac.nowcoder.com/acm/contest/700/I 时间限制:C/C++ 1 ...

  7. 第十届蓝桥杯2019年C/C++ 大学B组省赛试题

    2019年第十届蓝桥杯大赛软件类省赛C/C++大学B组 试题 A:组队 本题总分:5分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1号位至 5号位各一名球员, 组成球队的首发阵容. 每位球 ...

  8. 第十届蓝桥杯2019年C/C++ 大学A组省赛试题

    2019年蓝桥杯第十届软件类省赛 C/C++ 大 学 A 组 试题 A: 平方和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包括 1 ...

  9. 记第十四届省赛参赛体会&第十三届

    emmm....时间还是很久远了 还是流水账 这次比赛我还是挺开心的 因为感觉我们余神就是一把宝剑,然后我是她的Buff 前面四道题就挺顺利都1A过了,十年余神就是强无敌呀 最后两分钟过了第五题,银牌 ...

随机推荐

  1. Lua 5.1 学习笔记

    1 简介 2 语法 2.1 语法约定 2.1.1 保留关键字 2.1.2 操作符 2.1.3 字符串定义 2.2 值与类型 2.2.1 强制转换 2.3 变量 2.3.1 索引 2.3.2 环境表 2 ...

  2. 【Golang基础】defer执行顺序

    defer 执行顺序类似栈的先入后出原则(FILO)     一个defer引发的小坑:打开文件,读取内容,删除文件   // 原始问题代码 func testFun(){ // 打开文件 file, ...

  3. R学习

    R内容: R-1 基础 R-2 基础绘图 R-3 t分布--t置信区间--t检验 R-4 方差分析 R-5 相关分析-卡方分析 R-6 线性回归模型分析流程 R实战第7章 线性回归 逻辑回归 主成分分 ...

  4. (转)Ioc控制反转和依赖注入

    转载地址:https://zhuanlan.zhihu.com/p/95869440 控制反转控制反转(Inversion of Control,简称IoC),是面向对象编程中的一种设计思想,其作用是 ...

  5. nginx 反向代理之 proxy_pass

    格式很简单: proxy_pass URL; 其中URL包含:传输协议(http://, https://等).主机名(域名或者IP:PORT).uri. 示例如下: proxy_pass http: ...

  6. npm与cnpm的区别

    NPM(Node Package Manager,节点包管理器)是NodeJS的包管理器,用于节点插件的管理(包括安装,卸载和管理依赖等).NPM是随同新版的NodeJS一起安装的包管理工具,所以我们 ...

  7. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU量产神器RT-Flash常见问题

    对于MCUBootUtility,RT-Flash工具,有任何使用上的问题,可以在本博客下留言,也可以扫码加入QQ交流群.

  8. ASP.NET MVC教程二:ASP.NET MVC应用程序结构详解

    在上一篇文章中,讲解了一些MVC的概念,并且创建了第一个ASP.NET MVC项目,这篇文章将讲解ASP.NET MVC程序中的代码解构,新创建的MVC应用程序解构如下图所示: 一.App_Data ...

  9. requests-html库render的使用

    一.render的使用 from requests_html import HTMLSession session =HTMLSession() response = session.get('htt ...

  10. nodejs编写后台

    1.引入核心模块 2.服务器监听窗口 3.创建服务器对象 4.设置服务器监听窗口 寻找路径 // 引入核心模块 const http = require('http') // 服务器监听窗口 cons ...