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 个点时连通的方案数. 考虑算补集:连通的方 ...
随机推荐
- C++远征之封装篇(下)-学习笔记
C++远征之封装篇(下) c++封装概述 下半篇依然围绕类 & 对象进行展开 将原本学过的简单元素融合成复杂的新知识点. 对象 + 数据成员 = 对象成员(对象作为数据成员) 对象 + 数组 ...
- stm32+lwip(四):网页服务器测试
我是卓波,很高兴你来看我的博客. 系列文章: stm32+lwip(一):使用STM32CubeMX生成项目 stm32+lwip(二):UDP测试 stm32+lwip(三):TCP测试 stm32 ...
- mysql 5.8 查询最新一条数据
SELECT * FROM ( ,) FROM (SELECT * FROM or_task_node ORDER BY created_date DESC) temp ) AS vars ) t g ...
- ABS(引数と同じ大きさの正の数を返す)
ABS 関数 [数値] 数値式の絶対値を返します. 構文 ABS( numeric-expression ) パラメータ numeric-expression 絶対値が返される数値. 戻り値 数値 ...
- python2.7入门---运算符 &案例
已经分享过变量类型的基本概念了,接下来就研究了一下运算符的基础知识.接下来我们就来看一下内容.举个简单的例子 4 +5 = 9 .例子中,4 和 5 被称为操作数,"+" ...
- linux c fprintf()
#include<stdio.h> #include<unistd.h> #include<time.h> int main(int argc,char *argv ...
- Spark是什么
官方直达电梯 Spark一种基于内存的通用的实时大数据计算框架(作为MapReduce的另一个更优秀的可选的方案) 通用:Spark Core 用于离线计算,Spark SQL 用于交互式查询,Spa ...
- 13 ThreadLocal
ThreadLocal 在多线程环境下,每个线程都有自己的数据.一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁. 1. 使用函数 ...
- 如何修改Github上提交的错误用户地址和姓名
Changing author info https://help.github.com/articles/changing-author-info/ To change the name an ...
- [转]struct2 拦截所有没有登录的用户,强行转到登录界面AuthorizationInterceptor
package com.sise.action; import java.util.Map; import com.opensymphony.xwork2.Action; import com ...