标签:
暴力枚举每条边是否选取,然后统计答案就行了,再次不赘述,可以通过测试点1。
观察
对于
对于算法三,瓶颈在于计算
这样就可以在
观察算法四中的瓶颈,发现在求斯特林数
根据第二类斯特林数的模型意义(不知道的请上网查吧),根据容斥原理,我们有
=
ps:不要问我怎么写FFT,我也不会T^T………
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
const long long Mod=998244353;
long long n,K;
long long S[100010]={0};
long long N=1;
long long a[300000]={0};
long long b[300000]={0};
long long c[300000]={0};
long long ksm(long long a,long long k,long long MM)
{
long long o=1;
for(;k;)
{
if(k&1)
o=(long long)o*a%MM;
a=(long long)a*a%MM;
k>>=1;
}
return o;
}
void FFT(long long *A,int num,int flag)
{
for(int i=0;i<num;i++)
{
int p=0,s=i;
for(int j=(num>>1);j>=1;j>>=1)
{
p|=(s&1)*j;
s>>=1;
}
if(p>i) swap(A[i],A[p]);
}
for(int l=2;l<=num;l<<=1)
{
long long w;
if(flag==1)
w=ksm(3,(Mod-1)/l,Mod);
else
{
long long help=ksm(3,Mod-2,Mod);
w=ksm(help,(Mod-1)/l,Mod);
}
for(int i=0;i<num;i+=l)
{
long long wk=1;
for(int j=0;j<(l>>1);j++)
{
long long u=A[i+j],t=wk*A[i+j+(l>>1)]%Mod;
A[i+j]=(u+t)%Mod;
A[i+j+(l>>1)]=(u-t+Mod)%Mod;
wk=wk*w%Mod;
}
}
}
if(flag==-1)
for(int i=0;i<num;i++)
A[i]=A[i]*ksm(num,Mod-2,Mod)%Mod;
return;
}
int main()
{
long long ans=0;
freopen("value.in","r",stdin);
freopen("value.out","w",stdout);
cin>>n>>K;
long long NI=1;
long long jiecheng=1;
int fh=1;
for(int i=0;i<=K;i++)
{
if(i==0)
{
a[i]=1;
b[i]=0;
}
else
{
jiecheng=jiecheng*ksm(i,Mod-2,Mod)%Mod;
a[i]=(fh*jiecheng+Mod)%Mod;
b[i]=ksm(i,K,Mod)*jiecheng%Mod;
}
fh*=-1;
}
N=1;
for(;N<K+K+1;N<<=1);
FFT(a,N,1);
FFT(b,N,1);
for(int i=0;i<N;i++)
c[i]=a[i]*b[i]%Mod;
FFT(c,N,-1);
for(long long i=0;i<=K;i++)
{
if(NI==0) break;
if(K==0)
c[0]=1;
ans+=c[i]*ksm(2,n-1-i,Mod)%Mod*NI%Mod;
NI=NI*(n-i-1)%Mod;
ans%=Mod;
}
ans=ans*n%Mod;
ans=ans*ksm(2,(n-1)*(n-2)/2,Mod)%Mod;
cout<<ans<<endl;
fclose(stdin);
fclose(stdout);
return 0;
}
原题的价值 出题人:VFleaking hnoi2015 集训
标签:
原文地址:http://blog.csdn.net/qq_21995319/article/details/44785921