城市规划

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

3

Sample Output

4

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的更多相关文章

  1. BZOJ 3456: 城市规划 多项式求逆

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

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

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

  3. 多项式求逆/分治FFT 学习笔记

    一.多项式求逆 给定一个多项式 \(F(x)\),请求出一个多项式 \(G(x)\), 满足 \(F(x) * G(x) \equiv 1 ( \mathrm{mod\:} x^n )\).系数对 \ ...

  4. BZOJ 3456: 城市规划 [多项式求逆元 DP]

    题意: 求出n个点的简单(无重边无自环)无向连通图数目.方案数mod 1004535809(479 * 2 ^ 21 + 1)即可. n<=130000 DP求方案 g(n) n个点所有图的方案 ...

  5. [模板] 多项式: 乘法/求逆/分治fft/微积分/ln/exp/幂

    多项式 代码 const int nsz=(int)4e5+50; const ll nmod=998244353,g=3,ginv=332748118ll; //basic math ll qp(l ...

  6. CF848E Days of Floral Colours——DP+多项式求逆/分治NTT

    官方题解:http://codeforces.com/blog/entry/54233 就是由简入繁 1.序列处理,只考虑一个半圆 2.环形处理(其实这个就是多了旋转同构) 然后基于分割线邻居的跨越与 ...

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

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

  8. hdu 5730 Shell Necklace [分治fft | 多项式求逆]

    hdu 5730 Shell Necklace 题意:求递推式\(f_n = \sum_{i=1}^n a_i f_{n-i}\),模313 多么优秀的模板题 可以用分治fft,也可以多项式求逆 分治 ...

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3456 分治FFT: 设 dp[ i ] 表示 i 个点时连通的方案数. 考虑算补集:连通的方 ...

随机推荐

  1. java 堆栈内存分析详解

    计算机术语里面堆和栈代表不同的存储结构:stack-栈:heap-堆 所以java虚拟机(JVM)中堆和栈是两种内存 堆.栈对比 对比点 堆 栈 JVM中的功能 内存数据区 内存指令区 动静态 运行时 ...

  2. 修改mysql root密码的方法

    方法1: 用SET PASSWORD命令 首先登录MySQL. 格式:mysql> set password for 用户名@localhost = password('新密码'); 例子:my ...

  3. 1394-Minimum Inversion Number

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  4. Java中的IO流体系

    Java为我们提供了多种多样的IO流,我们可以根据不同的功能及性能要求挑选合适的IO流,如图10-7所示,为Java中IO流类的体系. 注:这里只列出常用的类,详情可以参考JDK API文档.粗体标注 ...

  5. Messy Code in Windows Server 2008 R2 English Edition

          We always use Windows Server 2008 R2 English operation system. And it doesn't have any problem ...

  6. 【连载】Bootstrap开发漂亮的前端界面之自定义右键菜单

    连载: 1<教你用Bootstrap开发漂亮的前端界面> 2.<Bootstrap开发漂亮的前端界面之实现原理> 网页中的自定义右键菜单越来越普遍,自定义右键菜单可以增强用户体 ...

  7. Windows自带的磁盘填充命令

    一张不用了的SD卡要给别人,之前一直是手机使用的,担心有一些资料被恢复,想要将它内容清空.以前就知道数字公司有一个磁盘填充的工具,后来网上搜一搜发现Windows有一个自带的命令用于磁盘填充. 首先进 ...

  8. 剑指offer-二进制中1的个数11

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. class Solution: def NumberOf1(self, n): # write code here coun ...

  9. LeetCode - 70. Climbing Stairs(0ms)

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

  10. HDU 4588 Count The Carries(数学统计)

    Description One day, Implus gets interested in binary addition and binary carry. He will transfer al ...