城市规划

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. .NET CORE LOG

    .NET CORE LOG 合格的应用程序不仅要求运行的高效和计算的准确,稳定及可靠性也要得到满足,同事,系统的可维护性也相当重要.谈及到可维护性,就必须涉及到系统运行状态的监控和异常的快速定位与跟踪 ...

  2. ionic 打包apk Failure [INSTALL_FAILED_USER_RESTRICTED: Install canceled by user]

    错误日志如下: Built the following apk(s): /Users/hongye0/Documents/project/haitoujiaApp/platforms/android/ ...

  3. 如何打war包

    1. 利用jdk里的工具 例如我们要打包的文件在D:\myHome\dist: 运行 cmd: cd D:\myHome\dist 进入D:\myHome\dist 然后输入 D:\myHome\di ...

  4. LeetCode:20. Valid Parentheses(Easy)

    1. 原题链接 https://leetcode.com/problems/valid-parentheses/description/ 2. 题目要求 给定一个字符串s,s只包含'(', ')',  ...

  5. PIC32MZ 通过USB在线升级 -- USB CDC bootloader

    了解bootloader 的实现,请加QQ: 1273623966 (验证填 bootloader):欢迎咨询或定制bootloader:我的博客主页www.cnblogs.com/geekygeek ...

  6. 使用uniflash串口烧写CC3200的常见问题

    1. 在正常情况下,cc3200的烧写使用的是芯片的PIN55和PIN57,只要把SOP2上拉既可正常烧写,常见问题是烧写的时候没有上拉SOP2,正常运行SOP2留空,IAR只能仿真调试,不能下载程序 ...

  7. Scala学习笔记(四):从文件里读取文本行

    第一个版本: import scala.io.Source if(args.length>0){ for(line<-Source.fromFile(args(0)).getLines) ...

  8. FJOI 2019 游记

    (FJOI 2019 滚粗记) Day 0 早上刷了一些水题,然后就上路了. (画图3D好好玩) 来得晚只有十几分钟时间看考场,于是连试机题都没有Ak. Day 1 果然我还是太菜了 走过来的时候再讨 ...

  9. static 关键字解析(转)

    static关键字解析   Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面 ...

  10. AtomicIntegerFieldUpdater使用

    假设现在有这样的一个场景: 一百个线程同时对一个int对象进行修改,要求只能有一个线程可以修改. 看看下面程序是否正确: private static int a = 100; private sta ...