bzoj 3456 城市规划 多项式求逆+分治FFT
城市规划
Time Limit: 40 Sec Memory Limit: 256 MB
Submit: 1091 Solved: 629
[Submit][Status][Discuss]
Description
刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了.
刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得整个国家的任意两个城市都直接或间接的连通. 为了省钱, 每两个城市之间最多只能有一条直接的贸易路径. 对于两个建立路线的方案, 如果存在一个城市对, 在两个方案中是否建立路线不一样, 那么这两个方案就是不同的, 否则就是相同的. 现在你需要求出一共有多少不同的方案.
好了, 这就是困扰阿狸的问题. 换句话说, 你需要求出n个点的简单(无重边无自环)无向连通图数目.
由于这个数字可能非常大, 你只需要输出方案数mod 1004535809(479 * 2 ^ 21 + 1)即可.
Input
仅一行一个整数n(<=130000)
Output
仅一行一个整数, 为方案数 mod 1004535809.
Sample Input
Sample Output
HINT
对于 100%的数据, n <= 130000
题解:http://blog.miskcoo.com/2015/05/bzoj-3456
我没什么好说的。
#include<cstring>
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm> #define ll long long
#define N 262144
#define mod 1004535809
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n;
ll Factor[N],Inv_Fac[N];
ll G[N],inv_fac[N],dao_G[N];
int rev[N]; ll fast_pow(ll x,ll y,ll MOD)
{
ll ret=;
while(y)
{
if(y&)ret=(ret*x)%MOD;
x=(x*x)%MOD;
y>>=;
}
return ret;
}
void init()
{
Factor[]=,Inv_Fac[]=;
for(int i=;i<=n;i++)
{
Factor[i]=Factor[i-]*i%mod;
Inv_Fac[i]=fast_pow(Factor[i],mod-,mod);
}
}
void NTT(ll *a,int num,int f)
{
for (int i=;i<num;i++)if(i<rev[i])swap(a[i],a[rev[i]]);
for (int i=;i<num;i<<=)
{
ll wn=fast_pow(,(mod-)/(i<<),mod);
for(int j=;j<num;j+=(i<<))
{
ll w=;
for (int k=;k<i;(w*=wn)%=mod,k++)
{
ll x=a[j+k],y=w*a[j+k+i]%mod;
a[j+k]=(x+y>=mod)?x+y-mod:x+y;a[j+k+i]=(x-y<)?x-y+mod:x-y;
}
}
}
if(f==-)
{
for (int i=;i<num/;i++)swap(a[i],a[num-i]);
ll inv=fast_pow(num,mod-,mod);
for (int i=;i<num;i++)(a[i]*=inv)%=mod;
}
}
void Get_Inv(ll *a,ll *b,int n)
{
static ll temp[N];
if(n==)
{
b[]=fast_pow(a[],mod-,mod);
return ;
}
Get_Inv(a,b,n>>);
memcpy(temp,a,sizeof(a[])*n);
memset(temp+n,,sizeof(a[])*n);
int m=n,L=,nn=n;
for(n=;n<=m;n<<=)L++;if (L) L--;
for(int i=;i<n;i++)rev[i]=(rev[i>>]>>)|((i&)<<L);
NTT(temp,n,),NTT(b,n,);
for(int i=;i<n;i++)
temp[i]=b[i]*(((2ll-temp[i]*b[i]%mod)%mod+mod)%mod)%mod;
NTT(temp,n,-);
for(int i=;i<(n>>);i++)b[i]=temp[i];
memset(b+nn,,sizeof(b[])*nn);
}
int main()
{
n=read(),init();
for(int i=;i<=n;i++)
{
if(i<)G[i]=;
else G[i]=fast_pow(,(ll)i*(i-)/,mod)*Inv_Fac[i]%mod;
}
for(int i=;i<=n;i++) dao_G[i-]=G[i]*i%mod;dao_G[n]=;
int l;for(l=;l<=n;l<<=);
Get_Inv(G,inv_fac,l);
int m=n,L=;
for(n=;n<=m;n<<=)L++;if (L) L--;
for(int i=;i<n;i++)rev[i]=(rev[i>>]>>)|((i&)<<L);
NTT(dao_G,n,),NTT(inv_fac,n,);
for(int i=;i<n;i++)
dao_G[i]=(inv_fac[i]*dao_G[i])%mod;
NTT(dao_G,n,-);
printf("%lld\n",(dao_G[m-]*fast_pow(m,mod-,mod)%mod)*Factor[m]%mod);
}
bzoj 3456 城市规划 多项式求逆+分治FFT的更多相关文章
- BZOJ 3456: 城市规划 多项式求逆
Description 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得整个国家的任意两个城市都直接 ...
- BZOJ 3456: 城市规划 [多项式求逆元 组合数学 | 生成函数 多项式求ln]
3456: 城市规划 题意:n个点组成的无向连通图个数 以前做过,今天复习一下 令\(f[n]\)为n个点的无向连通图个数 n个点的完全图个数为\(2^{\binom{n}{2}}\) 和Bell数的 ...
- 多项式求逆/分治FFT 学习笔记
一.多项式求逆 给定一个多项式 \(F(x)\),请求出一个多项式 \(G(x)\), 满足 \(F(x) * G(x) \equiv 1 ( \mathrm{mod\:} x^n )\).系数对 \ ...
- BZOJ 3456: 城市规划 [多项式求逆元 DP]
题意: 求出n个点的简单(无重边无自环)无向连通图数目.方案数mod 1004535809(479 * 2 ^ 21 + 1)即可. n<=130000 DP求方案 g(n) n个点所有图的方案 ...
- [模板] 多项式: 乘法/求逆/分治fft/微积分/ln/exp/幂
多项式 代码 const int nsz=(int)4e5+50; const ll nmod=998244353,g=3,ginv=332748118ll; //basic math ll qp(l ...
- CF848E Days of Floral Colours——DP+多项式求逆/分治NTT
官方题解:http://codeforces.com/blog/entry/54233 就是由简入繁 1.序列处理,只考虑一个半圆 2.环形处理(其实这个就是多了旋转同构) 然后基于分割线邻居的跨越与 ...
- 【BZOJ3456】城市规划 多项式求逆
[BZOJ3456]城市规划 Description 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得 ...
- hdu 5730 Shell Necklace [分治fft | 多项式求逆]
hdu 5730 Shell Necklace 题意:求递推式\(f_n = \sum_{i=1}^n a_i f_{n-i}\),模313 多么优秀的模板题 可以用分治fft,也可以多项式求逆 分治 ...
- bzoj 3456 城市规划——分治FFT / 多项式求逆 / 多项式求ln
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3456 分治FFT: 设 dp[ i ] 表示 i 个点时连通的方案数. 考虑算补集:连通的方 ...
随机推荐
- Hadoop学习(一) Hadoop是什么
Hadoop是什么? Hadoop是一个开发和运行处理大规模数据的软件平台,是Appach的一个用Java语言实现开源软件框架,实现在大量计算机组成的集群中对海量数据进行分布式计算. Hadoop框架 ...
- xss挑战赛小记 0x03(xssgame)
0x00 继续做xss吧 这次是xssgame 地址 http://www.xssgame.com/ 一共八关 学到了很多东西 0x01 啥也没有 <svg/onload="alert ...
- Python3全栈学习目录
http://www.cnblogs.com/wupeiqi/articles/4938499.html 文辉整理: http://blog.51cto.com/9272317/1869914
- LINUX系统配置相关
修改系统引导文件 grub.cfg的文件位置 /boot/grub/grub.cfg set default="4" 默认windows是在第四个选项 set timeout ...
- Bash中使用MySQL导入导出CSV格式数据[转]
转自: http://codingstandards.iteye.com/blog/604541 MySQL中导出CSV格式数据的SQL语句样本如下: select * from test_inf ...
- java集合浅谈(一)
一.类库结构图概览 容器对象仅能持有对象引用(对象的指针),而不是Copy对象信息,从网上搜得几张Java中集合类库的结构图,如下所示: 二.解说Collection 2.1 Collection ( ...
- Git 相关工具及教程地址
一.Git GUI 客户端 Git 客户端下载(Windows) TortoiseGit 客户端下载(Windows) Sourcetree 客户端下载(Windows.Mac) Git Extens ...
- Python 3基础教程30-sys模块
本文介绍sys模块,简单打印两个重定向输出. 目前使用机会没有,以后实际用到了,再去研究和学习.
- SetWindowPos,RegisterHotKey,GlobalAddAtom的用法
还以为SetWindowPos是给Frm的子框架间编写的,原来是给mainfrm写的,可以把你写的主窗口置顶,置底(看样子应该可以变成桌面了,还没试呢,才忙到现在...) 子窗口的遮挡可以使用窗口的样 ...
- Tensorflow Serving介绍及部署安装
TensorFlow Serving 是一个用于机器学习模型 serving 的高性能开源库.它可以将训练好的机器学习模型部署到线上,使用 gRPC 作为接口接受外部调用.更加让人眼前一亮的是,它支持 ...