分治+ntt

设dp[i]表示i个点的图联通的方案数

那么考虑dp,利用容斥,总-不符合,枚举j=1->i-1,然后考虑不符合,那么考虑和1联通的连通块,剩下的不和1连通,那么dp[i]=2^t(i)-∑j=1->i-1 dp[j]*C(i-1,j-1)*2^t(i-j)

就是t(i)表示i个点的图的边的个数,那么相当于在j个点的连通图又添加了i-j个点,计算从i-1选出j-1个方案数,这是组合数,然后剩下的不能喝这j个点连,那么自己内部随便连,就是这个式子

但是这是n^2的,我们化简式子变成卷积,dp[j]*C(i-1,j-1)*2^t(i-j)

dp[j]*(i-1)!/(j-1)!/(i-j)!*2^t(i-j)

(dp[j]/(j-1)!)*2^t(i-j)/(i-j)

这是卷积,但是由于dp[i]和dp[j]有关,那么用cdq优化。

这是第二次写,还是搞不太清楚下标问题,其实就是构造多项式的时候每个式子个往前移了多少,那么最后统计的时候也往后移动多少

完全不卡常啊

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = , P = ;
int n, m, k;
ll h[N], a[N], b[N], inv[N], facinv[N], fac[N], dp[N], t[N];
ll power(ll x, ll t)
{
ll ret = ;
for(; t; t >>= , x = x * x % P) if(t & ) ret = ret * x % P;
return ret;
}
void ntt(ll *a, int f)
{
for(int i = ; i < n; ++i)
{
int t = ;
for(int j = ; j < k; ++j) if(i >> j & ) t |= << (k - j - );
if(i < t) swap(a[i], a[t]);
}
for(int l = ; l <= n; l <<= )
{
ll w = power(, f == ? (P - ) / l : (P - ) - (P - ) / l);
int m = l >> ;
for(int i = ; i < n; i += l)
{
ll t = ;
for(int k = ; k < m; ++k, t = t * w % P)
{
ll x = a[i + k], y = a[i + k + m] * t % P;
a[i + k] = (x + y) % P;
a[i + k + m] = ((x - y) % P + P) % P;
}
}
}
if(f == -)
{
ll inv = power(n, P - );
for(int i = ; i < n; ++i) a[i] = a[i] * inv % P;
}
}
void cdq(int l, int r)
{
if(l == r) return;
int mid = (l + r) >> ;
cdq(l, mid);
n = ;
k = ;
while(n <= r - l + ) n <<= , ++k;
for(int i = ; i < n; ++i) a[i] = b[i] = ;
for(int i = l; i <= mid; ++i) a[i - l] = dp[i] * facinv[i - ] % P;
for(int i = ; i <= r - l; ++i) b[i] = h[i] * facinv[i] % P;
ntt(a, );
ntt(b, );
for(int i = ; i < n; ++i) a[i] = a[i] * b[i] % P;
ntt(a, -);
for(int i = mid + ; i <= r; ++i) dp[i] = ((dp[i] - a[i - l] * fac[i - ] % P) % P + P) % P;
cdq(mid + , r);
}
int main()
{
scanf("%d", &m);
fac[] = facinv[] = ;
inv[] = inv[] = ;
for(int i = ; i <= m; ++i)
{
if(i != ) inv[i] = (P - P / i) * inv[P % i] % P;
fac[i] = fac[i - ] * i % P;
facinv[i] = facinv[i - ] * inv[i] % P;
t[i] = (ll)i * (i - ) >> ;
dp[i] = h[i] = power(, t[i]);
}
cdq(, m);
printf("%lld\n", dp[m]);
return ;
}

最新文章

  1. sass安装
  2. AD域的安装(在Windows Server 2003中安装Active Directory)
  3. Git-TortoiseGit完整配置流程
  4. 初探JavaScript(一)——也谈元素节点、属性节点、文本节点
  5. flask+sqlite3+echarts2+ajax数据可视化--静态图
  6. HDU 2544 单源最短路
  7. ORB特征点检测
  8. 中国快递包裹总量的预测-基于SARIMA模型
  9. 【poj3348】 Cows
  10. Bson
  11. Mysql导入导出工具Mysqldump和Source命令用法详解
  12. 火狐对innerHtml的支持问题
  13. sort 命令
  14. python 文件夹比较
  15. mac 下搭建 Android 开发环境
  16. hdu1200(来来回回串起来)
  17. jquery从tr获取td
  18. Java 8——Optional
  19. 【转载自netfocus博客】聚合(根)、实体、值对象精炼思考总结
  20. 使用grep排除空行和注释行

热门文章

  1. PHP compact() 函数
  2. 请问如何突破”所选文件超出了文件的最大值设定:25.00 Mb“限制
  3. Food hub
  4. Jenkins Robot framework 持续集成环境搭建
  5. hdu3251 最小割
  6. ZYThumbnailTableView---堪比一个小型阅读App
  7. php接收post过来的 json数据 例子
  8. Linux的基本使用
  9. 阿里云nginx+thinkphp环境运行会直接下载php文件的问题。
  10. 图像处理之opencv---加减乘除运算cvdiv