搞出递推式。

发现可以变成三个函数的乘积。

移项之后就可以求逆+NTT做了。

miskoo博客中有讲

#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define mp make_pair
#define md 1004535809
#define g 3
#define maxn 500005 int rev[maxn],n; int ksm(int a,int b)
{
int ret=1;
for (;b;b>>=1,a=(ll)a*a%md) if (b&1) ret=(ll)ret*a%md;
return ret;
} void NTT(int *x,int n,int flag)
{
F(i,0,n-1) if (rev[i]>i) swap(x[rev[i]],x[i]);
for (int m=2;m<=n;m<<=1)
{
int wn=ksm(g,((md-1)/m*flag+md-1)%(md-1));
for (int i=0;i<n;i+=m)
{
int w=1;
for (int j=0;j<(m>>1);++j)
{
int u=x[i+j],v=(ll)x[i+j+(m>>1)]*w%md;
x[i+j]=(u+v)%md; x[i+j+(m>>1)]=(u-v+md)%md;
w=(ll)w*wn%md;
}
}
}
if (flag==-1)
{
int inv=ksm(n,md-2);
F(i,0,n-1) x[i]=(ll)x[i]*inv%md;
}
} int fac[maxn],fac_inv[maxn],C[maxn],G[maxn],F[maxn],N,Inv_G[maxn]; void Get_Inv(int *a,int *b,int n)
{
static int tmp[maxn];if (n==1){b[0]=ksm(a[0],md-2);return;}
Get_Inv(a,b,n>>1);F(i,0,n-1)tmp[i]=a[i],tmp[i+n]=0;
int L=0;while(!(n>>L&1))L++;
F(i,0,(n<<1)-1)rev[i]=(rev[i>>1]>>1)|((i&1)<<L);
NTT(tmp,n<<1,1);NTT(b,n<<1,1);
F(i,0,(n<<1)-1) tmp[i]=(ll)b[i]*(2LL-(ll)tmp[i]*b[i]%md+md)%md;
NTT(tmp,n<<1,-1);F(i,0,n-1) b[i]=tmp[i],b[n+i]=0;
} int main()
{
scanf("%d",&n);
fac[0]=1;F(i,1,maxn-1) fac[i]=(ll)fac[i-1]*i%md;
fac_inv[maxn-1]=ksm(fac[maxn-1],md-2);
D(i,maxn-2,0) fac_inv[i]=(ll)fac_inv[i+1]*(i+1)%md;
for (N=1;N<=n;N<<=1);
F(i,0,n) C[i]=(ll)ksm(2,(ll)i*(i-1)/2%(md-1))*fac_inv[i-1]%md;
F(i,0,n) G[i]=(ll)ksm(2,(ll)i*(i-1)/2%(md-1))*fac_inv[i]%md;
Get_Inv(G,Inv_G,N);
NTT(C,N<<1,1);NTT(Inv_G,N<<1,1);
F(i,0,(N<<1)-1) F[i]=(ll)C[i]*Inv_G[i]%md;
NTT(F,N<<1,-1);
printf("%d\n",(ll)F[n]*fac[n-1]%md);
}

  

Po姐讲了另外一种方法。

哈哈哈,完全不会,抄抄抄

#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define mp make_pair
#define maxn 500005
#define md 1004535809
#define g 3 int rev[maxn]; int ksm(int a,int b)
{
int ret=1;
for (;b;b>>=1,a=(ll)a*a%md) if (b&1) ret=(ll)ret*a%md;
return ret;
} void NTT(int *x,int n,int flag)
{
F(i,0,n-1) if (rev[i]>i) swap(x[rev[i]],x[i]);
for (int m=2;m<=n;m<<=1)
{
int wn=ksm(g,((md-1)/m*flag+md-1)%(md-1));
for (int i=0;i<n;i+=m)
{
int w=1;
for (int j=0;j<(m>>1);++j)
{
int u=x[i+j],v=(ll)x[i+j+(m>>1)]*w%md;
x[i+j]=(u+v)%md; x[i+j+(m>>1)]=(u-v+md)%md;
w=(ll)w*wn%md;
}
}
}
if (flag==-1)
{
int inv=ksm(n,md-2);
F(i,0,n-1) x[i]=(ll)x[i]*inv%md;
}
} int n,G[maxn],F[maxn],Inv_G[maxn],N,fac[maxn],fac_inv[maxn],Der_G[maxn]; void Get_Inv(int *a,int *b,int n)
{
static int tmp[maxn];if (n==1){b[0]=ksm(a[0],md-2);return;}
Get_Inv(a,b,n>>1);F(i,0,n-1)tmp[i]=a[i],tmp[n+i]=0;
int L=0;while(!(n>>L&1)) L++;
F(i,0,(n<<1)-1) rev[i]=(rev[i>>1]>>1)|((i&1)<<L);
NTT(tmp,n<<1,1);NTT(b,n<<1,1);
F(i,0,(n<<1)-1) tmp[i]=(ll)b[i]*(2-(ll)tmp[i]*b[i]%md+md)%md;
NTT(tmp,n<<1,-1); F(i,0,n-1) b[i]=tmp[i],b[i+n]=0;
} int main()
{
scanf("%d",&n);
fac[0]=1;F(i,1,maxn-1) fac[i]=(ll)fac[i-1]*i%md;
fac_inv[maxn-1]=ksm(fac[maxn-1],md-2);
for (N=1;N<=n;N<<=1);
D(i,maxn-2,0)fac_inv[i]=(ll)fac_inv[i+1]*(i+1)%md;
F(i,0,n)G[i]=(ll)ksm(2,(ll)i*(i-1)/2%(md-1))*fac_inv[i]%md;
Get_Inv(G,Inv_G,N);
F(i,1,N-1) Der_G[i-1]=(ll)G[i]*i%md;
int L=0;while(!(N>>L&1)) L++;
F(i,0,(N<<1)-1) rev[i]=(rev[i>>1]>>1)|((i&1)<<L);
NTT(Der_G,N<<1,1);NTT(Inv_G,N<<1,1);
F(i,0,(N<<1)-1)F[i]=(ll)Der_G[i]*Inv_G[i]%md;
NTT(F,N<<1,-1);
printf("%d\n",(ll)F[n-1]*ksm(n,md-2)%md*fac[n]%md);
}

  

BZOJ 3456 城市规划 ——NTT的更多相关文章

  1. BZOJ 3456 城市规划 ( NTT + 多项式求逆 )

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3456 题意: 求出\(n\)个点的简单(无重边无自环)无向连通图的个数.(\(n< ...

  2. [BZOJ 3456]城市规划(cdq分治+FFT)

    [BZOJ 3456]城市规划(cdq分治+FFT) 题面 求有标号n个点无向连通图数目. 分析 设\(f(i)\)表示\(i\)个点组成的无向连通图数量,\(g(i)\)表示\(i\)个点的图的数量 ...

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

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

  4. bzoj 3456: 城市规划【NTT+多项式求逆】

    参考:http://blog.miskcoo.com/2015/05/bzoj-3456 首先推出递推式(上面的blog讲的挺清楚的),大概过程是正难则反,设g为n个点的简单(无重边无自环)无向图数目 ...

  5. [BZOJ 3456]城市规划

    Description 题库链接( bzoj 权限题,可以去 cogs 交♂ 题库链接2 求含有 \(n\) 个点有标号的简单无向联通图的个数.方案数对 \(1004535809(479\times ...

  6. BZOJ 3456: 城市规划 与 多项式求逆算法介绍(多项式求逆, dp)

    题面 求有 \(n\) 个点的无向有标号连通图个数 . \((1 \le n \le 1.3 * 10^5)\) 题解 首先考虑 dp ... 直接算可行的方案数 , 容易算重复 . 我们用总方案数减 ...

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

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

  8. bzoj 3456 城市规划 多项式求逆+分治FFT

    城市规划 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1091  Solved: 629[Submit][Status][Discuss] Desc ...

  9. bzoj 3456 城市规划 —— 分治FFT / 多项式求逆 / 指数型生成函数(多项式求ln)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3456 首先考虑DP做法,正难则反,考虑所有情况减去不连通的情况: 而不连通的情况就是那个经典 ...

随机推荐

  1. Python pep8代码规范

    title: Python pep8代码规范 tags: Python --- 介绍(Introduction) 官方文档:PEP 8 -- Style Guide for Python Code 很 ...

  2. C#的接口基础教程之三 定义接口成员

    接口可以包含一个和多个成员,这些成员可以是方法.属性.索引指示器和事件,但不能是常量.域.操作符.构造函数或析构函数,而且不能包含任何静态成员.接口定义创建新的定义空间,并且接口定义直 接包含的接口成 ...

  3. 用@vue/cli发布npm包

    1.环境准备 安装node,npm,@vue/cli 2.初始化项目 用@vue/cli创建新项目 vue create mtest-ui 删除public,main.js,App.vue等无关文件, ...

  4. 深入理解Java GC

    一.概述 GC(Carbage Collection)垃圾收集器,由JVM自动回收已死亡的对象垃圾. 这也是Java与C++等语言的主要区别之一. 二.如何确认对象已死 1. 引用计数算法 引用计数法 ...

  5. 关于HTML(含HTML5)的块级元素和行级(内联)元素总结

    1.首先我们要知道什么是块级元素和行级(内联)元素? 块级(block)元素的特点: ①总是在新行上开始: ②高度,行高以及外边距和内边距都可控制: ③宽度缺省是它的容器的100%,除非设定一个宽度: ...

  6. 23.VUE学习之-列表的排序sort

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Flask学习笔记:数据库迁移操作flask-script+alembic/flask-migrate

    数据库迁移是将代码中模型类(即表)的修改同步到数据库中, flask-sqlalchemy的模型类一旦使用create_all()映射到数据库中后,对这个模型类的修改(例如添加了一个新的字段)就不会再 ...

  8. vi a.sh ABCD

    E: 无法定位软件包 ubuntu预装的是 vim tiny,安装vim full版本,可以解决 卸载vim-tiny: $ sudo apt-get remove vim-common 安装vim ...

  9. python单元测试用例

    demo1.py #!/usr/bin/python # encoding: utf-8 def hello(): print "i am in demo1" def add(x, ...

  10. HDU 2177 取(2堆)石子游戏

    取(2堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...