城市规划

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. R语言学习笔记(五):零碎知识点(11-15)

    11--which.min(), which.max()和which() which(x, arr.ind = FALSE, useNames = TRUE) x 是一个向量或者数组,可以是NA,但会 ...

  2. JVM内存管理机制和垃圾回收机制

    JVM内存管理机制和垃圾回收机制 JVM结构 图片描述: java源码编译成class文件 class文件通过类加载器加载到内存 其中方法区存放的是运行时的常量.静态变量.类信息等,被所有线程共享 堆 ...

  3. SpringCloud项目,接口调用返回http 500 - Internal Server Error的错误

    今天上班的时候,自己正在参与的Spring Cloud项目出现了问题,原本上周五还正常的项目突然所有接口调用都是返回http 500的错误. 项目的状态是在Eureka上可以看到对应微服务是在线状态, ...

  4. Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. org/apache/hadoop/hbase/

    Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. org/apache/hadoop/hbase/ ...

  5. MySQL server has gone away 错误处理

    解决方案1: 这个是mysql自身的一个机制:     mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决办法有两个:     1.修改mysql 配置               增 ...

  6. .NET基础知识之七——索引器

           索引器是什么?有什么作用?索引器允许类的实例以访问数组的形式来访问对象里面的属性.如我们经常可以看到类似于dr["name"]="test",或者 ...

  7. 基于语音转录的ted演讲推荐

    论文地址:https://arxiv.org/abs/1809.05350v1 二.  实现 我们从Kaggle[6]中获取了TED演讲数据集,其中包括2400个TED演讲的数据,包括标题.演讲者.标 ...

  8. 学习人工智能的第五个月[字典学习[Dictionary Learning,DL]]

    摘要: 大白话解释字典学习,分享第五个月的学习过程,人生感悟,最后是自问自答. 目录: 1.字典学习(Dictionary Learning,DL) 2.学习过程 3.自问自答 内容: 1.字典学习( ...

  9. [转]Hibernate入门:批量插入数据

    转自:http://blog.csdn.net/xiazdong/article/details/7709068 一般如果要插入100万条数据,则会写如下代码: package org.xiazdon ...

  10. android自定义View绘制圆形头像与椭圆头像

    要实现这两种效果,需要自定义View,并且有两种实现方式.   第一种: public class BitmapShaders extends View {     private  BitmapSh ...