这道题真的还是简单的一批.....
我当时要是参加考试的话该多好(凭这一道题就能进前 5 了)
十分显然的指数型生成函数.
令 $f[i]$ 表示有 $i$ 个点的答案.
然后显然有 $f[i]=\sum_{j=1}^{i}\binom{i}{j} \times \frac{j!}{j} \times f[i-j]$
然后这个就是一个 EGF 的形式.
令 $A(x)$ 表示只有一个环的时候的生成函数.
然后有 $ans[i]=[x^i] \sum_{i} \frac{A^i(x)}{i!}$
故 $ans[i]=[x^i] e^{A(x)}$
code:
#include
#include
#include
#include
#include
#define ll long long
#define ull unsigned long long
using namespace std;
namespace IO
{
char buf[100000],*p1,*p2;
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int rd()
{
int x=0; char s=nc();
while(s<'0') s=nc();
while(s>='0') x=(((x<<2)+x)<<1)+s-'0',s=nc();
return x;
}
void print(int x) {if(x>=10) print(x/10);putchar(x%10+'0');}
void setIO(string s)
{
string in=s+".in";
string out=s+".out";
freopen(in.c_str(),"r",stdin);
// freopen(out.c_str(),"w",stdout);
}
};
const int G=7;
const int N=400005;
const int mod=950009857;
int A[N],B[N],w[2][N],mem[N*100],*ptr=mem,tmpa[N],tmpb[N],aa[N],bb[N];
inline int qpow(int x,int y)
{
int tmp=1;
for(;y;y>>=1,x=(ll)x*x%mod) if(y&1) tmp=(ll)tmp*x%mod;
return tmp;
}
inline int INV(int a) { return qpow(a,mod-2); }
inline void ntt_init(int len)
{
int i,j,k,mid,x,y;
w[1][0]=w[0][0]=1,x=qpow(G,(mod-1)/len),y=qpow(x,mod-2);
for (i=1;ik) swap(a[i],a[k]);
for(j=len>>1;(k^=j)>=1);
}
for(mid=1;mid>1,la);
int l=len<<1,i;
memset(A,0,l*sizeof(A[0]));
memset(B,0,l*sizeof(A[0]));
memcpy(A,a,min(la,len)*sizeof(a[0]));
memcpy(B,b,len*sizeof(b[0]));
ntt_init(l);
NTT(A,l,1),NTT(B,l,1);
for(i=0;i>1,la);
for(i=0;i>1);++i) aa[i]=b[i];
get_ln(b,bb,len,len>>1);
for(i=0;i=la?0:a[i]))%mod;
bb[0]=(bb[0]+1)%mod;
ntt_init(l);
NTT(aa,l,1),NTT(bb,l,1);
for(i=0;i=b.len) c.a[i]=a[i];
else c.a[i]=(a[i]-b.a[i]+mod)%mod;
}
return c;
}
poly operator/(poly u)
{
int n=len,m=u.len,l=1;
while(l<(n-m+1)) l<<=1;
rev(),u.rev();
poly v=u.Inv(l);
v.get_mod(n-m+1);
poly re=(*this)*v;
rev(),u.rev();
re.get_mod(n-m+1);
re.rev();
return re;
}
poly operator%(poly u)
{
poly re=(*this)-u*(*this/u);
re.get_mod(u.len-1);
return re;
}
};
#define MAX 400003
int fac[N],in[N],g[N],bu[N];
void init()
{
int i,j;
fac[0]=in[0]=1;
for(i=1;i