HDU-5552(CDQ+NTT)

HDU-5552(CDQ+NTT)

这道题的本质其实是求\(n\)个点带环联通图的数量

实际上就是\(n\)个点联通图的数量减去树的数量

树的数量可以通过\(Prufer\)序列得到是\(n^{n-2}\),这个东西去问度娘吧

\(n\)个点联通图的数量你可以去做 BZOJ-3456 详细题解

注意这道题比较特殊,\(n\)个点随意的方案数是\((m+1)^{n(n-1)/2}\)

#include
using namespace std;

#define reg register
typedef long long ll;
#define rep(i,a,b) for(reg int i=a,i##end=b;i<=i##end;++i)
#define drep(i,a,b) for(reg int i=a,i##end=b;i>=i##end;--i)

char IO;
int rd(){
    int s=0;
    while(!isdigit(IO=getchar()));
    do s=(s<<1)+(s<<3)+(IO^'0');
    while(isdigit(IO=getchar()));
    return s;
}

const ll N=2e4+10,P=152076289;
const ll G=106,IG=101862420;

ll qpow(ll x,ll k){
    ll res=1;
    for(;k;k>>=1,x=x*x%P) if(k&1) res=res*x%P;
    return res;
}

int n,m;
ll Inv[N],Fac[N],Pow[N];
ll dp[N],g[N];
int rev[N];
void NTT(int n,ll *a,int f) {
    rep(i,1,n-1) if(rev[i]>1;
    Solve(l,mid);
    int R=1,cc=-1;
    while(R<=r-l+2) R<<=1,cc++;
    rep(i,1,R) rev[i]=(rev[i>>1]>>1)|((i&1)<

你可能感兴趣的:(HDU-5552(CDQ+NTT))