我的写法应该是可以过的,但是最后三个点T了,提交记录里和我做法类似的最后三个点只用了500ms左右,但是我T了。
#include<bits/stdc++.h>
using namespace std;
const int N=20,M=(1<<20);
typedef long long ll;
int n,m,s,xs[M];
int mod=998244353,d[N],k[N],b[N],deg[N],ks[N],bs[N];
int f[M];
int head[N],ver[N*2],ne[N*2],tot;
inline int read()
{
int ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
while(ch>='0'&&ch<='9'){ret=ret*10+ch-'0';ch=getchar();}
return ret*f;
}
inline int ksm(int x,int y)
{
int res=1;
while(y)
{
if(y&1) res=1ll*res*x%mod;
x=1ll*x*x%mod;y>>=1;
}
return res;
}
inline void add(int x,int y)
{
ver[++tot]=y;ne[tot]=head[x];head[x]=tot;
}
void dfs(int x,int fa,int S)
{
bool ok=((S>>(x-1))&1);
k[x]=b[x]=ks[x]=bs[x]=0;
for(int i=head[x];i;i=ne[i])
{
int y=ver[i];
if(y==fa) continue;
dfs(y,x,S);
if(!ok) ks[x]=(ks[x]+k[y])%mod,bs[x]=(bs[x]+b[y])%mod;
}
if(!ok)
{
k[x]=ksm((deg[x]-ks[x]+mod)%mod,mod-2);
b[x]=1ll*(deg[x]+bs[x])*k[x]%mod;
}
}
int main()
{
n=read(),m=read(),s=read();
for(int i=1;i<n;i++)
{
int x=read(),y=read();
add(x,y);add(y,x);
deg[x]++;deg[y]++;
}
xs[0]=-1;
for(int i=1;i<(1<<n);i++)
{
xs[i]=xs[i>>1]*((i&1) ? -1 : 1);
dfs(s,0,i);
f[i]=b[s]*xs[i];
}
for(int i=0;i<n;i++)
for(int j=1;j<(1<<n);j++)
if(j&(1<<i)) f[j]=(f[j^(1<<i)]+f[j])%mod;
for(int i=1;i<=m;i++)
{
int siz=read(),now=0;
for(int j=1;j<=siz;j++)
{
int x=read();
now|=(1<<(x-1));
}
printf("%d\n",(f[now]+mod)%mod);
}
return 0;
}