【LG4841】城市规划

题面

洛谷

题解

记\(t_i\)表示\(i\)个点的无向图个数,显然\(t_i=2^{C_i^2}\)。

设\(f_i\)表示\(i\)个点的无向连通图个数,容斥一下,枚举\(1\)号点所在连通块的大小,再让剩下的点随便构成联通图,

则有:

\[f_i=t_i-\sum_{j=1}^{i-1}f_j*C_{i-1}^{j-1}*t_{i-j}
\]

展开组合数:

\[f_i=t_i-\sum_{j=1}^{i-1}f_j*t_{i-j}*\frac {(i-1)!}{(i-j)!(j-1)!}\\
\Leftrightarrow \frac {f_i}{(i-1)!}=\frac {t_i}{(i-1)!}-\sum_{j=1}^{i-1}\frac {f_j}{(j-1)!}*\frac {t_{i-j}}{(i-j)!}
\]

设\(g_i=\frac {f_i}{(i-1)!},h_i=\frac {t_i}{i!}\),那么

\[g_i=i*h_i-\sum_{j=1}^{i-1}g_i*h_i
\]

分治+\(NTT\)即可。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int Mod = 1004535809;
int fpow(int x, int y) {
int res = 1;
while (y) {
if (y & 1) res = 1ll * res * x % Mod;
x = 1ll * x * x % Mod;
y >>= 1;
}
return res;
}
const int G = 3, iG = fpow(G, Mod - 2);
const int MAX_N = 4e5 + 5; int Limit, rev[MAX_N];
void NTT(int *p, int op) {
for (int i = 0; i < Limit; i++) if (i < rev[i]) swap(p[i], p[rev[i]]);
for (int i = 1; i < Limit; i <<= 1) {
int rot = fpow(op == 1 ? G : iG, (Mod - 1) / (i << 1));
for (int j = 0; j < Limit; j += (i << 1)) {
int w = 1;
for (int k = 0; k < i; k++, w = 1ll * w * rot % Mod) {
int x = p[j + k], y = 1ll * w * p[i + j + k] % Mod;
p[j + k] = (x + y) % Mod, p[i + j + k] = (x - y + Mod) % Mod;
}
}
}
if (op == -1) {
int inv = fpow(Limit, Mod - 2);
for (int i = 0; i < Limit; i++) p[i] = 1ll * p[i] * inv % Mod;
}
} int g[MAX_N], h[MAX_N];
void Div(int l, int r) {
if (l == r) return ;
static int A[MAX_N], B[MAX_N], C[MAX_N];
int mid = (l + r) >> 1;
Div(l, mid);
int p = 0;
for (Limit = 1; Limit <= (r - l) * 2; Limit <<= 1, ++p) ;
for (int i = 0; i < Limit; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (p - 1));
for (int i = 0; i <= mid - l; i++) A[i] = g[i + l];
for (int i = 0; i < r - l; i++) B[i] = h[i + 1];
for (int i = mid - l + 1; i < Limit; i++) A[i] = 0;
for (int i = r - l; i < Limit; i++) B[i] = 0;
NTT(A, 1); NTT(B, 1);
for (int i = 0; i < Limit; i++) C[i] = 1ll * A[i] * B[i] % Mod;
NTT(C, -1);
for (int i = mid + 1; i <= r; i++) g[i] = (g[i] - C[i - 1 - l] + Mod) % Mod;
Div(mid + 1, r);
}
int N, fac[MAX_N], ifc[MAX_N];
int C(int n, int m) {
if (m > n) return 0;
else return 1ll * fac[n] * ifc[m] % Mod * ifc[n - m] % Mod;
}
int main () {
#ifndef ONLINE_JUDGE
freopen("cpp.in", "r", stdin);
#endif
cin >> N;
fac[0] = 1; for (int i = 1; i <= N; i++) fac[i] = 1ll * fac[i - 1] * i % Mod;
ifc[N] = fpow(fac[N], Mod - 2); for (int i = N - 1; ~i; i--) ifc[i] = 1ll * ifc[i + 1] * (i + 1) % Mod;
for (int i = 1; i <= N; i++) h[i] = 1ll * fpow(2, 1ll * i * (i - 1) / 2 % (Mod - 1)) * ifc[i] % Mod;
for (int i = 1; i <= N; i++) g[i] = 1ll * ifc[i - 1] * fpow(2, 1ll * i * (i - 1) / 2 % (Mod - 1)) % Mod;
Div(1, N);
printf("%d\n", (int)(1ll * g[N] * fac[N - 1] % Mod));
return 0;
}

【LG4841】城市规划的更多相关文章

  1. 浅谈城市规划在移动GIS方面的应用发展

    1.概述 城市建设进程加快,城市规划管理工作日趋繁重,各种来源的数据产生各种层出不穷的问题,严重影响城市规划时的准确性,为此全面合理的掌握好各方面的城市规划资料才能做出更加科学的决策.移动端的兴起为规 ...

  2. 【BZOJ-1952】城市规划 [坑题] 仙人掌DP + 最大点权独立集(改)

    1952: [Sdoi2010]城市规划 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 73  Solved: 23[Submit][Status][ ...

  3. BZOJ 3456: 城市规划 [多项式求逆元 组合数学 | 生成函数 多项式求ln]

    3456: 城市规划 题意:n个点组成的无向连通图个数 以前做过,今天复习一下 令\(f[n]\)为n个点的无向连通图个数 n个点的完全图个数为\(2^{\binom{n}{2}}\) 和Bell数的 ...

  4. 【BZOJ3456】城市规划(生成函数,多项式运算)

    [BZOJ3456]城市规划(生成函数,多项式运算) 题面 求\(n\)个点的无向连通图个数. \(n<=130000\) 题解 \(n\)个点的无向图的个数\(g(n)=2^{C_n^2}\) ...

  5. 洛谷 P4841 城市规划 解题报告

    P4841 城市规划 题意 n个有标号点的简单(无重边无自环)无向连通图数目. 输入输出格式 输入格式: 仅一行一个整数\(n(\le 130000)\) 输出格式: 仅一行一个整数, 为方案数 \( ...

  6. 【BZOJ3456】城市规划 多项式求逆

    [BZOJ3456]城市规划 Description 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得 ...

  7. 【BZOJ 3456】 3456: 城市规划 (NTT+多项式求逆)

    3456: 城市规划 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 658  Solved: 364 Description 刚刚解决完电力网络的问题 ...

  8. [BZOJ3456]城市规划(生成函数+多项式求逆+多项式求ln)

    城市规划 时间限制:40s      空间限制:256MB 题目描述 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了.  刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一 ...

  9. bzoj 3456 城市规划 多项式求逆+分治FFT

    城市规划 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1091  Solved: 629[Submit][Status][Discuss] Desc ...

随机推荐

  1. PhoneGap获取设备信息

    一. 获取设备信息的方法列表(如果没有或者检测不出来就显示undefined) 1.device.name              设备名称(一些国产机检测不出来) 2.device.model   ...

  2. python不用正则过渡括号

  3. 【[HNOI2008]GT考试】

    我又来复习\(kmp\)了 其实这道题主要是一个矩阵乘法,但是\(kmp\)在其中也有着非常重要的作用 我们可以这样定义状态\(dp[i][j]\)表示文本串进行到了\(i\)位置,同时文本串在最后和 ...

  4. PAT——1025. 反转链表

    给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转.例如:给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5→4:如果K为4,则输出应该为4→3→2→1→5→6,即最后 ...

  5. 创建DBLink----Oracle和mysql

    Oracle: DROP PUBLIC DATABASE LINK NM_HN; CREATE PUBLIC DATABASE LINK NM_HN CONNECT TO XZXT IDENTIFIE ...

  6. ovs加dpdk在日志中查看更多运行细节的方法

    想查看更多dpdk+ovs的更多运行细节,可以采用以下方法,增加更多运行日志. 在终端输入: ovs-appctl vlog/set dpdk:file:dbg ovs-appctl vlog/set ...

  7. win10 切换网卡的bat

    @echo off >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system3 ...

  8. The number of sections contained in the collection view after the update (1) must be equal to the number of sections contained in the collection view before the update (0), plus or minus the number of

    现象:当删除CollectionView 当中的某个section的时候,报上面的错误 初步分析:当前CollectionView删除前后都不止一个Section,怎么会报那样的错误:猜想可能是相册界 ...

  9. IE6下出现横向滚动条问题的解决方案

    当我们在css样式设置为html {overflow-y:auto;}时,在ie7以上版本应用时不会有问题,可是在ie6下就会发现垂直滚动条出现会引起横向滚动条出现.究其原因是在ie6下,当内容过多出 ...

  10. 复习宝典之Mysql数据库

    查看更多宝典,请点击<金三银四,你的专属面试宝典> 第一章:mysql数据库 1)mysql与mariaDb MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用 ...