子集枚举,DP,容斥
今天晚上突然不太舒服。。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MOD 1000000007 #define MAXN 20 #define M 101000 using namespace std; int n,up,a[MAXN][MAXN]; long long f[M],g[M]; int main(){ cin>>n; for(int i=0;i<n;i++)for(int j=0;j<n;j++)cin>>a[i][j]; up=1<<n; for(int i=1;i<up;i++){ g[i]=1; for(int j=0;j<n;j++)if(i&(1<<j)) for(int k=j+1;k<n;k++)if(i&(1<<k)) g[i]=g[i]*(a[j][k]+1)%MOD; f[i]=g[i]; int cur=i^(i&-i); for(int j=cur;j;j=(j-1)&cur) f[i]=(f[i]-g[j]*f[i^j]%MOD+MOD)%MOD; } cout<<f[up-1]; }