P10813 【MX-S2-T4】 换 题解
Coffee_zzz · · 题解
显然,序列
我们可以暴力求出每个
其中,
求出
时间复杂度
const int N=20,M=505,S=1<<18,mod=1e9+7;
int n,k,V,m,p[M],q[M],h[S],sum[S],f[N][S],ans;
void add(int &a,int b){
a+=b;
if(a>=mod) a-=mod;
}
int ad(int a,int b){
a+=b;
if(a>=mod) a-=mod;
return a;
}
int lowbit(int x){
return x&-x;
}
int ksm(int a,int b){
int res=1;
while(b){
if(b&1) res=1ll*res*a%mod;
b>>=1,a=1ll*a*a%mod;
}
return res;
}
void solve(){
cin>>n>>V>>m;
for(int i=1;i<=m;i++) cin>>p[i]>>q[i],p[i]--,q[i]--;
k=1<<n;
for(int s=0;s<k;s++){
int t=s;
for(int i=1;i<=m;i++) if(((t>>p[i])&1)>((t>>q[i])&1)) t=t^(1<<p[i])^(1<<q[i]);
if(lowbit(t)+t==k) h[s]=1;
}
f[0][0]=1;
for(int i=1;i<=n;i++){
for(int s=0;s<k;s++) sum[s]=f[i-1][s];
for(int p=1;p<k;p<<=1){
for(int s=0;s<k;s++){
if(s&p) continue;
add(sum[s|p],sum[s]);
}
}
for(int s=0;s<k;s++){
if(h[s]==0) f[i][s]=0;
else f[i][s]=ad(sum[s],mod-f[i-1][s]);
}
}
for(int w=1;w<=n;w++){
int pro=1;
for(int i=V-w+1;i<=V;i++) pro=1ll*pro*i%mod;
for(int i=1;i<=w;i++) pro=1ll*pro*ksm(i,mod-2)%mod;
add(ans,1ll*pro*f[w][k-1]%mod);
}
cout<<ans<<endl;
}