3456: 城市规划

Time Limit: 40 Sec  Memory Limit: 256 MB
Submit: 658  Solved: 364

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

Source

 
 
 
【分析】
  又是看题解和抄代码的好季节。。。
  呵呵呵
  【关于多项式求逆看这里
  

  

  转自:http://blog.miskcoo.com/2015/05/bzoj-3456

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Mod 1004535809
#define LL long long
#define Maxn 130000*4
const int G=; int fac[Maxn],F[Maxn],H[Maxn],V[Maxn]; int qpow(int x,int b)
{
int ans=;
while(b)
{
if(b&) ans=1LL*ans*x%Mod;
x=1LL*x*x%Mod;
b>>=;
}
return ans;
} int R[Maxn];
void NTT(int *a,int nn,int t)
{
for(int i=,j=;i<nn;i++)
{
if(i>j) swap(a[i],a[j]);
for(int l=(nn>>);(j^=l)<l;l>>=);
}
for(int i=;i<nn;i<<=)
{
int wn=qpow(G,(Mod-)/(i<<));
for(int j=;j<nn;j+=(i<<))
{
int w=;
for(int k=;k<i;k++)
{
int x=a[j+k],y=1LL*w*a[j+k+i]%Mod;
a[j+k]=(x+y)%Mod;a[j+k+i]=((x-y)%Mod+Mod)%Mod;
w=1LL*w*wn%Mod;
}
}
}
if(t==-)
{
int inv=qpow(nn,Mod-);
reverse(a+,a+nn);
for(int i=;i<=nn;i++) a[i]=1LL*a[i]*inv%Mod;
}
} // int temp[Maxn];
void get_inv(int *a,int *b,int len)
{
static int temp[Maxn];
if(len==)
{
b[]=qpow(a[],Mod-);
b[]=;
return;
}
get_inv(a,b,len>>);
for(int i=;i<=len;i++) temp[i]=a[i];
for(int i=len+;i<=len<<;i++) temp[i]=;
// memcpy(temp,a,sizeof(int)*len);
// memset(temp+len,0,sizeof(int)*len);
NTT(temp,len<<,),NTT(b,len<<,);
for(int i=;i<(len<<);i++) b[i]=1LL*b[i]*(-1LL*temp[i]*b[i]%Mod+Mod)%Mod;
NTT(b,len<<,-);
memset(b+len,,sizeof(int)*len);
} int n,m;
void fal()
{
for(int i=;i<=m;i++) H[i-]=1LL*F[i]*i%Mod;
get_inv(F,V,m);
NTT(H,m,);NTT(V,m,);
for(int i=;i<=m;i++) F[i]=1LL*H[i]*V[i]%Mod;
NTT(F,m,-);
for(int i=n;i>=;i--) F[i]=1LL*F[i-]*qpow(i,Mod-)%Mod;
} int main()
{
scanf("%d",&n);
m=;while(m<=*n) m<<=;
fac[]=;for(int i=;i<=n;i++) fac[i]=1LL*fac[i-]*i%Mod;
F[]=;
for(int i=;i<=n;i++)
{
F[i]=1LL*qpow(,1LL*i*(i-)/%(Mod-))*qpow(fac[i],Mod-)%Mod;
}
fal();
F[n]=1LL*F[n]*fac[n]%Mod;
printf("%d\n",F[n]);
return ;
}

尝试了好多遍,发现不用static 似乎是不行的?

2017-04-15 11:54:42

【BZOJ 3456】 3456: 城市规划 (NTT+多项式求逆)的更多相关文章

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

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

  2. 【bzoj3456】城市规划 容斥原理+NTT+多项式求逆

    题目描述 求出n个点的简单(无重边无自环)无向连通图数目mod 1004535809(479 * 2 ^ 21 + 1). 输入 仅一行一个整数n(<=130000) 输出 仅一行一个整数, 为 ...

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

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

  4. 【BZOJ】3456: 城市规划 动态规划+多项式求逆

    [题意]求n个点的带标号无向连通图个数 mod 1004535809.n<=130000. [算法]动态规划+多项式求逆 [题解]设$g_n$表示n个点的无向图个数,那么显然 $$g_n=2^{ ...

  5. BZOJ 3456: 城市规划(dp+多项式求逆)

    传送门 解题思路 这道题就是求带标号的无向连通图个数,首先考虑\(O(n^2)\)的做法,设\(f_i\)表示有\(i\)个节点的无向连通图个数,那么考虑容斥,先把所有的无向图求出,即为\(2^{C( ...

  6. BZOJ 4555 [Tjoi2016&Heoi2016]求和 ——分治 NTT 多项式求逆

    不想多说了,看网上的题解吧,我大概说下思路. 首先考察Stirling的意义,然后求出递推式,变成卷积的形式. 然后发现贡献是一定的,我们可以分治+NTT. 也可以直接求逆(我不会啊啊啊啊啊) #in ...

  7. [BZOJ3456]城市规划:DP+NTT+多项式求逆

    写在前面的话 昨天听吕老板讲课,数数题感觉十分的神仙. 于是,ErkkiErkko这个小蒟蒻也要去学数数题了. 分析 Miskcoo orz 带标号无向连通图计数. \(f(x)\)表示\(x\)个点 ...

  8. BZOJ1042 HAOI2008硬币购物(任意模数NTT+多项式求逆+生成函数/容斥原理+动态规划)

    第一眼生成函数.四个等比数列形式的多项式相乘,可以化成四个分式.其中分母部分是固定的,可以多项式求逆预处理出来.而分子部分由于项数很少,询问时2^4算一下贡献就好了.这个思路比较直观.只是常数巨大,以 ...

  9. P4233-射命丸文的笔记【NTT,多项式求逆】

    正题 题目链接:https://www.luogu.com.cn/problem/P4233 题目大意 随机选择一条有哈密顿回路的\(n\)个点的竞赛图,求选出图的哈密顿回路的期望个数. 对于每个\( ...

随机推荐

  1. 那些相见恨晚的 JavaScript 技巧

    JavaScript 的成功让人津津乐道,为 Web 网页编写 JavaScript 代码已经是所有 Web 设计师的基本功,这门有趣的语言蕴藏着许多不为人熟知的东西,即使多年的 JavaScript ...

  2. 【BZOJ】1023: [SHOI2008]cactus仙人掌图 静态仙人掌(DFS树)

    [题意]给定仙人掌图(每条边至多在一个简单环上),求直径(最长的点对最短路径).n<=50000,m<=10^7. [算法]DFS树处理仙人掌 [题解]参考:仙人掌相关问题的处理方法(未完 ...

  3. 【译】msfvenom

    原文链接:MSFvenom 1.使用MSFvenom命令行界面 msfvenom是Msfpayload和Msfencode的组合,将这两个工具集成在一个框架实例中. msfvenom的优点是: 一个单 ...

  4. HDU 2593 Pirates’ Code (STL容器)

    题目链接 Problem Description Davy Jones has captured another ship and is smiling contently under the sun ...

  5. HDU 1577 WisKey的眼神 (找规律 数学)

    题目链接 Problem DescriptionWisKey的眼镜有500多度,所以眼神不大好,而且他有个习惯,就是走路喜欢看着地(不是为了拣钱哦^_^),所以大家下次碰见他的时候最好主动打下招呼,呵 ...

  6. java检验银行卡号

    /* 校验过程: 1.从卡号最后一位数字开始,逆向将奇数位(1.3.5等等)相加. 2.从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,将个位十位数字相加,即将其减去9),再求和 ...

  7. 详细介绍Linux finger命令的使用

    Linux 允许多个用户使用不同的终端同时登陆,Linux finger命令为系统管理员提供知道某个时候到底有多少用户在使用这台Linux主机的方法,对于这个简单的命令我们还是先介绍一下再举例吧. L ...

  8. Math类的数学计算功能

    //Math类的数学计算功能 public class MathTest { public static void main(String[] args) { /*----------下面是三角运算- ...

  9. nexus 安装配置

    一.下载Nexus http://nexus.sonatype.org/downloads 我是用的版本是 nexus-2.11.4-01-bundle.tar.gz 每个版本的配置有些许差别. 二. ...

  10. fprintf输出到文件中,sprintf输出到字符串中. 如: fprintf(fp,"%s",name); fp为文件指针 sprintf(buff,"%s",name); buff为字符数组

    fprintf输出到文件中,sprintf输出到字符串中. 如: fprintf(fp,"%s",name); fp为文件指针 sprintf(buff,"%s" ...