栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C. 奇奇怪怪的魔法阵(未搞懂)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C. 奇奇怪怪的魔法阵(未搞懂)

C. 奇奇怪怪的魔法阵

题意:

n个点m条边,定义集合S为独立集,当且仅当任意x,y∈S,x与y之间没有边。空集也是独立集
现在对于每一个点的集合T,有多少子集为独立集
设N=0,1,…,n-1, A T = ∑ S ⊂ T [ S 是 独 立 集 ] A_{T}=sum_{S⊂T}[S是独立集] AT​=∑S⊂T​[S是独立集]。对于每一个T⊂N,求出 A T A_T AT​
1<=n<=26

题解:

看这个数据范围就很明显,复杂度是(1<<26),正好1s内
而且肯定是dp转移,但是还是不知道咋做,看了题解恍然大悟

设dp[msk]表示msk的子集内独立集的个数。开始考虑转移,在msk中随便选一个元素i。对于元素i有两种情况,考虑i在不在独立集里,如果不在的话,i号点对其他点是没有影响的,那么直接从dp[msk^(1< 以上这是官方题集,我现在还有很大的疑惑?等想明白继续更新

代码:
#include
using namespace std;
const int mod=1e9+7;
int n,m,x,y,msk[55],dp[(1<<26)+10],fun[(1<<25)+10],id,ans;
int main()
{
	scanf("%d%d",&n,&m);
	for (int i=0;i=mod) dp[i]-=mod;
	}
	for (int i=(1<=0;i--) ans=(233ll*ans+dp[i])%mod;
	printf("%dn",ans);
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/330469.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号