标签:lg ok subS int mo 1ll 串珠 集训 2012
这个模型见过好几次了, 似乎很经典,就是一些点集形成的任意非连通图都可以表示为一个连通块和其它若干联通块。
#include <bits/stdc++.h>
const int mo = 1e9 + 7;
int g[17][17], n, lg[1<<16];
int all_[1<<16], ok_[1<<16], not_[1<<16];
int main() {
scanf("%d", &n);
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
scanf("%d", &g[i][j]);
lg[0] = -1;
for (int i=1; i<(1<<n); ++i) lg[i] = lg[i>>1] + 1;
for(int S=1; S<(1<<n); ++S) {
all_[S] = 1;
for(int i=1; i<=n; ++i)
for(int j=i+1; j<=n; ++j)
if(((S>>(i-1))&1) && ((S>>(j-1))&1))
all_[S] = (1ll * all_[S] * (g[i][j] + 1ll)) % mo;
int p = lg[S&(-S)];
for(int subS=(S-1)&S; subS; subS=(subS-1)&S) if((subS>>p)&1) {
not_[S] += (1ll * ok_[subS] * all_[S ^ subS]) % mo;
not_[S] %= mo;
}
ok_[S] = all_[S] - not_[S];
ok_[S] = (ok_[S] % mo + mo) % mo;
}
std::cout << ok_[(1<<n)-1];
return 0;
}
标签:lg,ok,subS,int,mo,1ll,串珠,集训,2012 来源: https://www.cnblogs.com/tztqwq/p/14262588.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。