HDU - 5117 Fluorescent(状压dp+思维)
题意
有N个灯和M个开关,每个开关控制着一些灯,如果按下某个开关,就会让对应的灯切换状态;问在每个开关按下与否的一共2^m情况下,每种状态下亮灯的个数的立方的和。
思路
1、首先注意到N<=50,M<=50,因此很容易想到状压;
2、考虑X^3,其中X就是每种状况下亮着的灯的数量;
3、如何解这个X^3?我们把它展开——
X=x1+x2+x3+...+xn,其中xi是第i个灯的亮或暗状况;
因此X^3=(x1+x2+x3+...+xn)*(x1+x2+x3+...+xn)*(x1+x2+x3+...+xn)=Σxi*xj*xk (1<=i<=j<=k<=n);
4、dp[m][state]代表前m个开关,达成状态为state的方案数,其中state从(000)2~(111)2,代表三个灯的亮或灭;在其基础上dp就行了;遍历i,j,k,同时将开关的控制状态压缩。
5、答案每次加上dp[m][7],因为只有xi=xj=xk=1时,才对X^3有贡献,总复杂度O(n^3*m);
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
#define ull unsigned long long
#define LOCAL using namespace std;
const int maxn=1e5+;
const int inf=0x3f3f3f3f;
const int mod=1e9+; ll d[][];
ll s[]; int main(){
int t,n,m,num;
cin>>t;
for(int kase=;kase<=t;kase++){
memset(s,,sizeof(s));
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
scanf("%d",&num);
for(int j=;j<=num;j++){
int t;
scanf("%d",&t);
s[i]|=(1LL<<t);///状压
}
}
ll ans=;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
for(int k=;k<=n;k++){
memset(d,,sizeof(d));
d[][]=;
for(int x=;x<=m;x++){
for(int y=;y<;y++){
int t=y;
if(s[x]&(1LL<<i)) t^=;
if(s[x]&(1LL<<j)) t^=;
if(s[x]&(1LL<<k)) t^=;
d[x][y]+=d[x-][y];
d[x][t]+=d[x-][y];
}
}
ans=(ans+d[m][])%mod;
}
}
}
printf("Case #%d: %lld\n",kase,ans);
}
return ;
}
HDU - 5117 Fluorescent(状压dp+思维)的更多相关文章
- HDU 4284Travel(状压DP)
HDU 4284 Travel 有N个城市,M条边和H个这个人(PP)必须要去的城市,在每个城市里他都必须要“打工”,打工需要花费Di,可以挣到Ci,每条边有一个花费,现在求PP可不可以从起点1 ...
- 7月15日考试 题解(链表+状压DP+思维题)
前言:蒟蒻太弱了,全打的暴力QAQ. --------------------- T1 小Z的求和 题目大意:求$\sum\limits_{i=1}^n \sum\limits_{j=i}^n kth ...
- HDU 4336 容斥原理 || 状压DP
状压DP :F(S)=Sum*F(S)+p(x1)*F(S^(1<<x1))+p(x2)*F(S^(1<<x2))...+1; F(S)表示取状态为S的牌的期望次数,Sum表示 ...
- HDU 3001 Travelling ——状压DP
[题目分析] 赤裸裸的状压DP. 每个点可以经过两次,问经过所有点的最短路径. 然后写了一发四进制(真是好写) 然后就MLE了. 懒得写hash了. 改成三进制,顺利A掉,时间垫底. [代码] #in ...
- HDU 5117:Fluorescent(状压DP + 思维)***
题目链接 题意 给出n个灯,m个开关,每个开关控制一些灯,如果打开这个开关,这个开关控制的灯如果本来灭的就会亮,如果本来亮的就会灭.问在每个开关按下与否的一共2^m情况下,每种状态下亮灯的个数的立方的 ...
- hdu 4114(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4114 思路:首先是floyd预处理出任意两点之间的最短距离.dp[state1][state2][u] ...
- HDU 3091 - Necklace - [状压DP]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3091 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- HDU 3811 Permutation 状压dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3811 Permutation Time Limit: 6000/3000 MS (Java/Othe ...
- hdu-5117 Fluorescent(状压dp)
题目链接: Fluorescent Time Limit: 3000/3000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Oth ...
随机推荐
- Use curl with uuid(uuidgen) under shell
#!set uuidtmp = uuid.tmp #!uuidgen > $uuidtmp #!set uuid=<$uuidtmp #!rm $uuidtmp #!echo $uuid ...
- XMLHttpRequest详解
XMLHttpRequest详解: https://xhr.spec.whatwg.org/
- Excel读写方案XLSReadWriteII使用技巧总结
XLSReadWriteII是一个读写Excel的组件.他的一般已用只要按照Demo操作基本都能实现,只要不是非常复杂的应用,XLSReadWriteII还是能够胜任的. 最近被派了一个写入图库的应用 ...
- 文件系统的block 数据库中的block 以及内存中的page基础知识汇总(自己理解 可能有误)
1. 操作系统文件系统中的的block 文件系统中的block 是文件系统最小的读写单元,在HDD的磁盘时代, 一般block的大小可能与磁盘的扇区大小一致为 512bytes 也因为这个原因MBR启 ...
- Node fs模块同步读取写入追加
JS文件中const fs = require("fs");console.log("开始进入文件读取.."); //同步的写入var data = fs.re ...
- HTMl Dom操作
訪問: getElementById():帶回指定id的所有元素 getElementByTagName():帶回指定標籤名的所有的元素 getElementByClassName():帶回指定類型名 ...
- html 響應式web設計
RWD(響應式web設計)可以根據尺寸大小傳遞網頁,對於平板和移動設備是必須的. <html lang="en-US"> lang表示頁面的主要語言.http://ww ...
- python---集合及深浅copy
一.集合 相信大家都在数学中接触过集合,在python中集合也是有这相同的性质,1.去重,集合会将内部元素自定去重 2.关系测试,类似数学中的交集并集子集一样 1.1如何创建集合 集合在python中 ...
- jenkins--svn+Email自动触发1(作业设置)
项目名称设置: svn设置: 触发构建设置: 构建加入sonar-scanner代码扫描: 邮件设置: 邮件触发器配置:
- String类型的特殊之处
String是一种特殊的引用类型,那么它究竟特殊在哪里? 请看看下面这个程序,输出什么结果? public static void changeStr(String str) { str = &quo ...