【CSP模拟赛】Adore(状压dp 二进制)
题目描述
小w偶然间见到了一个DAG。这个DAG有m层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k个节点。现在小w每次可以取反第i(1<i<n-1)层和第i+1层之间的连边。也就是把原本从(i,k1)连到(i+1,k2)的边,变成从(i,k2)连到(i+1,k1)。请问他有多少种取反的方案,把从源点到汇点的路径数变成偶数条?答案对998244353取模。
输入描述
一行两个整数m,k。接下来m-1行,第一行和最后一行有k个整数0或1,剩下每行有k2个整数0或1,第(j-1)×k+t个整数表示(i,j)到(i+ 1,t)有没有边。
输出描述
一行一个整数表示答案。
输入样例
5 3
1 0 1
0 1 0 1 1 0 0 0 1
0 1 1 1 0 0 0 1 1
0 1 1
输出样例
4
20%的数据满足n≤10,k≤2。
40%的数据满足n≤103,k≤2。
60%的数据满足m≤103,k≤5。
100%的数据满足4≤m≤104,k≤10。
分析
看不懂题目手玩样例玩了一个小时都没玩出来最后发现自己少连了一条边
由于路径数量并不需要知道具体的值,只需要知道奇偶性就行,而且发现k还这么小,所以考虑状压dp
dp[i][s]表示到达i层时 到达各点方案数的奇偶性情况为s 的方案数。
这个可以根据题目中给出的边求出下一个状态,因为存在反转所以每次有两种转移方式
于是某个憨憨高兴地用k2的转移方法获得了60pts的好成绩
对于每次给的边,我们可以预处理出每个点与下一层点的连边情况并状压起来
因为只有奇数转移才会影响状态,所以只需要找到方案数为奇数的点然后让下一个状态异或上之前预处理好的它的连边状态就可以得到下一层的状态了
Code
#include<cstdio>
const int mod=;
int n,K,st,ans,dp[][],V[][];
int main()
{
scanf("%d%d",&n,&K);
for(int i=,a;i<=K;i++)scanf("%d",&a),st=(st<<)+a;dp[][st]=;
for(int i=;i<n-;i++)
{
int a[]={},b[]={};
for(int j=K;j>=;j--)for(int k=K,o;k>=;k--)
scanf("%d",&o),a[j]|=o<<(k-),b[k]|=o<<(j-);
for(st=;st<=(<<K)-;st++)if(dp[i][st])
{
int ed1=,ed2=;
for(int j=;j<=K;j++)if(st&(<<(j-)))ed1^=a[j],ed2^=b[j];
(dp[i+][ed1]+=dp[i][st])%=mod;
(dp[i+][ed2]+=dp[i][st])%=mod;
}
}
for(int i=K;i>=;i--)scanf("%d",&V[i][]);
for(st=;st<=(<<K)-;st++)if(dp[n-][st])
{
int cnt=;
for(int j=;j<=K;j++)if(st&(<<(j-))&&V[j][])cnt^=;
if(cnt==)(ans+=dp[n-][st])%=mod;
}
printf("%d\n",ans);
}
【CSP模拟赛】Adore(状压dp 二进制)的更多相关文章
- 4.26 省选模拟赛 T3 状压dp 差分求答案
LINK:T3 比较好的题目 考试的时候被毒瘤的T2给搞的心态爆炸 这道题连正解的思路都没有想到. 一看到题求删除点的最少个 可以使得不连通. 瞬间想到最小割 发现对于10分直接跑最小割即可. 不过想 ...
- NOIp模拟赛 巨神兵(状压DP 容斥)
\(Description\) 给定\(n\)个点\(m\)条边的有向图,求有多少个边集的子集,构成的图没有环. \(n\leq17\). \(Solution\) 问题也等价于,用不同的边集构造DA ...
- POJ1185 状压dp(二进制//三进制)解法
很显然这是一道状压dp的题目 由于每个最优子结构和前两行有关,一个显而易见的想法是用三维dp[i][j][k]用来记录在第i行下为j状态,i - 1行为k状态时的最大值,然而dp[100][1 < ...
- BZOJ 1688: [Usaco2005 Open]Disease Manangement 疾病管理 状压DP + 二进制 + 骚操作
#include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) #defin ...
- 模拟赛毒瘤状压DP题:Kronican
Kronican 内存限制:32 MiB 时间限制:2000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 上传者: cqbzgm 题目描述 Mislav有N个无限体积的杯子,每一个杯子中都 ...
- 2018.10.17 NOIP模拟 管道(状压dp)
传送门 状压dp好题. 怎么今天道道题都有点东西啊 对于今天题目神仙出题人先膜为上策:%%%%DzYoAk_UoI%%%% 设f[i][j]f[i][j]f[i][j]表示选取点的状态集合为iii,当 ...
- 2018.09.08 NOIP模拟 division(状压dp)
这么sb的题考场居然写挂了2233. 假设n=∏iaiki" role="presentation" style="position: relative;&qu ...
- 2018.08.29 NOIP模拟 movie(状压dp/随机化贪心)
[描述] 小石头喜欢看电影,选择有 N 部电影可供选择,每一部电影会在一天的不同时段播 放.他希望连续看 L 分钟的电影.因为电影院是他家开的,所以他可以在一部电影播放过程中任何时间进入或退出,当然他 ...
- bzoj 5299: [Cqoi2018]解锁屏幕 状压dp+二进制
比较简单的状压 dp,令 $f[S][i]$ 表示已经经过的点集为 $S$,且最后一个访问的位置为 $i$ 的方案数. 然后随便转移一下就可以了,可以用 $lowbit$ 来优化一下枚举. code: ...
随机推荐
- day34-python之进程调用
1.信号量 import threading,time class myThread(threading.Thread): def run(self): if semaphore.acquire(): ...
- mac环境下Android 反编译
连接地址: https://www.jianshu.com/p/3a305f32c4a3
- java23种设计模式专攻:生产者-消费者模式的三种实现方式
公司的架构用到了dubbo.带我那小哥也是个半吊子,顺便就考我生产者消费者模式,顺便还考我23种java设计模式,
- IIS-This configuration section cannot be used at this path.
Q:在IIS上部署web后,游览器打开报以下异常: This configuration section cannot be used at this path. This happens when ...
- APC (Asynchronous Procedure Call)
系统创建新线程时,会同时创建与这个线程相关联的队列,即异步过程调用(APC)的队列. 一些异步操作可以通过加入APC来实现,比如我现在学习的IO请求/完成. BOOL ReadFileEx( HAND ...
- Kotlin编译器优化与when关键字详解
Any类型: 定义一个函数,其参数接受所有类型,对于Java而言Object是所有类的基类,而在Kotlin中得用Any关键字,如下: 其中瞅一下该Any字段是个啥类型: 然后里面做一些判断: 这是因 ...
- 51nod 2494 最长配对
小b有一个01序列,她想找到一个最长的区间使得这个区间的01能两两配对,即0的个数和1的个数相等.求最长区间的长度. 收起 输入 第一行一个正整数n,表示数组长度,其中0<n≤50000: ...
- Redis中如何保证数据库和缓存双写时的数据的一致性?
简单的场景: 直接使用 1. 使用Cache Aside pattern 读取的时候,先读取缓存中是否有数据,缓存中没有数据,再去数据库中进行查询,查询出来以后,然后再存入到缓存中 更新的时候,先删除 ...
- LightOJ - 1173 - The Vindictive Coachf(DP)
链接: https://vjudge.net/problem/LightOJ-1173 题意: The coach of a football team, after suffering for ye ...
- [NgRx] NgRx Data Fetching Solution - How to Load Data Only If Needed
We have a reoslver, which everytime we want visit '/courses' route, it will be triggered, then api w ...