bzoj3456 城市规划

3456: 城市规划

Time Limit: 40 Sec   Memory Limit: 256 MB
Submit: 342   Solved: 204
[ 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




NTT,思路很好

分享题解链接:http://blog.csdn.net/popoqqq/article/details/46049331




#include
#include
#include
#include
#include
#include
#define F(i,j,n) for(int i=j;i<=n;i++)
#define D(i,j,n) for(int i=j;i>=n;i--)
#define ll long long
#define maxn 300000
#define mod 1004535809
using namespace std;
int n,rev[maxn];
ll fac[maxn],a[maxn],b[maxn],c[maxn],inv_b[maxn],tmp[maxn];
inline ll getpow(ll x,ll y)
{
    ll ret=1;
    for(;y;y>>=1,x=x*x%mod) if (y&1) ret=ret*x%mod;
    return ret;
}
void ntt(ll *a,int n,int flag)
{
    F(i,0,n-1) if (i>1;
        ll wn=getpow(3,((mod-1)/m*flag+(mod-1))%(mod-1));
        for(int i=0;i>1);
    memcpy(tmp,a,sizeof(a[0])*n);
    memset(tmp+n,0,sizeof(a[0])*n);
    int m=1,len=-1;
    while (m<(n<<1)) m<<=1,len++;
    F(i,1,m-1) rev[i]=(rev[i>>1]>>1)|((i&1)<>1]>>1)|((i&1)<


你可能感兴趣的:(好题,NTT,OIer的狂欢)