【BZOJ 3456】 3456: 城市规划 (NTT+多项式求逆)
3456: 城市规划
Time Limit: 40 Sec Memory Limit: 256 MB
Submit: 658 Solved: 364Description
刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了.
刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得整个国家的任意两个城市都直接或间接的连通. 为了省钱, 每两个城市之间最多只能有一条直接的贸易路径. 对于两个建立路线的方案, 如果存在一个城市对, 在两个方案中是否建立路线不一样, 那么这两个方案就是不同的, 否则就是相同的. 现在你需要求出一共有多少不同的方案.
好了, 这就是困扰阿狸的问题. 换句话说, 你需要求出n个点的简单(无重边无自环)无向连通图数目.
由于这个数字可能非常大, 你只需要输出方案数mod 1004535809(479 * 2 ^ 21 + 1)即可.Input
仅一行一个整数n(<=130000)
Output
仅一行一个整数, 为方案数 mod 1004535809.
Sample Input
3Sample Output
4HINT
对于 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+多项式求逆)的更多相关文章
- BZOJ 3456 城市规划 ( NTT + 多项式求逆 )
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3456 题意: 求出\(n\)个点的简单(无重边无自环)无向连通图的个数.(\(n< ...
- 【bzoj3456】城市规划 容斥原理+NTT+多项式求逆
题目描述 求出n个点的简单(无重边无自环)无向连通图数目mod 1004535809(479 * 2 ^ 21 + 1). 输入 仅一行一个整数n(<=130000) 输出 仅一行一个整数, 为 ...
- BZOJ 3456: 城市规划 与 多项式求逆算法介绍(多项式求逆, dp)
题面 求有 \(n\) 个点的无向有标号连通图个数 . \((1 \le n \le 1.3 * 10^5)\) 题解 首先考虑 dp ... 直接算可行的方案数 , 容易算重复 . 我们用总方案数减 ...
- 【BZOJ】3456: 城市规划 动态规划+多项式求逆
[题意]求n个点的带标号无向连通图个数 mod 1004535809.n<=130000. [算法]动态规划+多项式求逆 [题解]设$g_n$表示n个点的无向图个数,那么显然 $$g_n=2^{ ...
- BZOJ 3456: 城市规划(dp+多项式求逆)
传送门 解题思路 这道题就是求带标号的无向连通图个数,首先考虑\(O(n^2)\)的做法,设\(f_i\)表示有\(i\)个节点的无向连通图个数,那么考虑容斥,先把所有的无向图求出,即为\(2^{C( ...
- BZOJ 4555 [Tjoi2016&Heoi2016]求和 ——分治 NTT 多项式求逆
不想多说了,看网上的题解吧,我大概说下思路. 首先考察Stirling的意义,然后求出递推式,变成卷积的形式. 然后发现贡献是一定的,我们可以分治+NTT. 也可以直接求逆(我不会啊啊啊啊啊) #in ...
- [BZOJ3456]城市规划:DP+NTT+多项式求逆
写在前面的话 昨天听吕老板讲课,数数题感觉十分的神仙. 于是,ErkkiErkko这个小蒟蒻也要去学数数题了. 分析 Miskcoo orz 带标号无向连通图计数. \(f(x)\)表示\(x\)个点 ...
- BZOJ1042 HAOI2008硬币购物(任意模数NTT+多项式求逆+生成函数/容斥原理+动态规划)
第一眼生成函数.四个等比数列形式的多项式相乘,可以化成四个分式.其中分母部分是固定的,可以多项式求逆预处理出来.而分子部分由于项数很少,询问时2^4算一下贡献就好了.这个思路比较直观.只是常数巨大,以 ...
- P4233-射命丸文的笔记【NTT,多项式求逆】
正题 题目链接:https://www.luogu.com.cn/problem/P4233 题目大意 随机选择一条有哈密顿回路的\(n\)个点的竞赛图,求选出图的哈密顿回路的期望个数. 对于每个\( ...
随机推荐
- 那些相见恨晚的 JavaScript 技巧
JavaScript 的成功让人津津乐道,为 Web 网页编写 JavaScript 代码已经是所有 Web 设计师的基本功,这门有趣的语言蕴藏着许多不为人熟知的东西,即使多年的 JavaScript ...
- 【BZOJ】1023: [SHOI2008]cactus仙人掌图 静态仙人掌(DFS树)
[题意]给定仙人掌图(每条边至多在一个简单环上),求直径(最长的点对最短路径).n<=50000,m<=10^7. [算法]DFS树处理仙人掌 [题解]参考:仙人掌相关问题的处理方法(未完 ...
- 【译】msfvenom
原文链接:MSFvenom 1.使用MSFvenom命令行界面 msfvenom是Msfpayload和Msfencode的组合,将这两个工具集成在一个框架实例中. msfvenom的优点是: 一个单 ...
- HDU 2593 Pirates’ Code (STL容器)
题目链接 Problem Description Davy Jones has captured another ship and is smiling contently under the sun ...
- HDU 1577 WisKey的眼神 (找规律 数学)
题目链接 Problem DescriptionWisKey的眼镜有500多度,所以眼神不大好,而且他有个习惯,就是走路喜欢看着地(不是为了拣钱哦^_^),所以大家下次碰见他的时候最好主动打下招呼,呵 ...
- java检验银行卡号
/* 校验过程: 1.从卡号最后一位数字开始,逆向将奇数位(1.3.5等等)相加. 2.从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,将个位十位数字相加,即将其减去9),再求和 ...
- 详细介绍Linux finger命令的使用
Linux 允许多个用户使用不同的终端同时登陆,Linux finger命令为系统管理员提供知道某个时候到底有多少用户在使用这台Linux主机的方法,对于这个简单的命令我们还是先介绍一下再举例吧. L ...
- Math类的数学计算功能
//Math类的数学计算功能 public class MathTest { public static void main(String[] args) { /*----------下面是三角运算- ...
- nexus 安装配置
一.下载Nexus http://nexus.sonatype.org/downloads 我是用的版本是 nexus-2.11.4-01-bundle.tar.gz 每个版本的配置有些许差别. 二. ...
- fprintf输出到文件中,sprintf输出到字符串中. 如: fprintf(fp,"%s",name); fp为文件指针 sprintf(buff,"%s",name); buff为字符数组
fprintf输出到文件中,sprintf输出到字符串中. 如: fprintf(fp,"%s",name); fp为文件指针 sprintf(buff,"%s" ...