Adore
(非公共题目)
问题描述
小 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) 有没有边。
输出格式
一行一个整数表示答案。
样例输入
样例输出
4
数据规模与约定
20% 的数据满足 n ≤ 10,k ≤ 2。
40% 的数据满足 n ≤ 103,k ≤ 2。
60% 的数据满足 m ≤ 103,k ≤ 5。
100% 的数据满足 4 ≤ m ≤ 104,k ≤ 10。
题解:
首先发现k ≤ 10,可以状态压缩。我们设dp[i][j]代表到了i行,当前行的状态为j的情况下的方案数。状态中的0和1代表当前行的每一个点,上面到这一个点的路径的条数的奇偶。
我们预处理一个数组orz[i]代表i这个数的状态,也就是i这个数的二进制位上1的个数的奇偶。这个可以递推不用一个一个求。
然后dp初值自然就是源点到第2层的状态了(第一层为源点)。把源点向i如果有连边,那么s|=(1<<i)。然后dp[1][s]=1。
对于中间的层数,我们枚举所有的状态1~210-1。然后进行转移,设a[i]代表当前这两层下面的那一层的第i个点,可以从上面哪一个点来,压缩一下,例如a[2]=5(101)代表上一层的点1和3有连向这一层的点2的一条边。然后我们设一个集合S=0。对于这一层的每一个点i。如果上一层的状态status,与(&)上这一个点的a[i],可以不能转移的自然就变成0了。到上一层的点的路径的奇偶状态转移到了这一个点,如果相加为奇数,也就是orz[status&a[i]]=1,的话代表到这一个点的路径的条数为奇数,那么集合S|=(1<<i)即可,S就是这一层的状态,我们一个一个的填进去。然后dp[i][S]+=dp[i-1][status]。取个模就可以了。然后对于题目中所说的“取反”的边,同样使用一个b[i]来存开一个SS=0来存同样转移即可了。
最后只要统计有哪些点连向汇点,就可以枚举n-1层所有可能的状态,如果status&s的orz是偶数,那么就可以ans+=dp[n-1][s]。
数组滚滚Great!
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define RG register
#define LL long long
#define fre(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);
using namespace std;
const int MAXN=,mod=;
int n,k,ans,s;
int dp[][(<<)+],orz[(<<)+];
int main()
{
fre("adore");
scanf("%d%d",&n,&k);
int All=(<<k)-;
int *now=dp[],*la=dp[];
for(int i=;i<=All;i++) orz[i]=orz[i>>]^(i&);
for(int i=,x;i<k;i++)
{
scanf("%d",&x);
s|=(x<<i);
}
la[s]=;
for(int i=;i<=n-;i++)
{
int a[]={},b[]={};
memset(now,,sizeof dp[]);
for(int j=,x;j<k;j++)
for(int l=;l<k;l++)
{
scanf("%d",&x);
a[l]|=(x<<j);
b[j]|=(x<<l);
}
for(int j=,S0,S1;j<=All;j++)
{
if(la[j])//加速
{
S0=S1=;
for(int l=;l<k;l++)
{
S0|=(orz[j&a[l]]<<l);
S1|=(orz[j&b[l]]<<l);
}
(now[S0]+=la[j])%=mod;
(now[S1]+=la[j])%=mod;
}
}
swap(now,la);//滚动数组。
}
s=;
for(int i=,x;i<k;i++)
{
scanf("%d",&x);
s|=(x<<i);
}
for(int i=;i<=All;i++)
(ans+=(orz[s&i]?:la[i]))%=mod;
printf("%d\n",ans);
return ;
}
Adore的更多相关文章
- Adore 解题报告
Adore 问题描述 小\(\text{w}\) 偶然间得到了\(1\)个 \(DAG\). 这个 \(DAG\) 有 \(m\) 层,第\(1\)层只有\(1\)个源点,最后\(1\)层只有\(1\ ...
- Let Us Adore 让我们来敬拜祂 中文歌词
Verse 1 诸天宣告 神的荣耀 万国万民 都将赞美 宣扬祂奇妙 The heavens declare The glory of God And all of the world Will j ...
- 【CSP模拟赛】Adore(状压dp 二进制)
题目描述 小w偶然间见到了一个DAG.这个DAG有m层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k个节点.现在小w每次可以取反第i(1<i<n-1)层和第i+1层之间的连 ...
- 【NOIP2017提高A组模拟10.7】Adore
题目 小w 偶然间见到了一个DAG. 这个DAG 有m 层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k 个节点. 现在小w 每次可以取反第i(1 < i < n - 1) ...
- [JZOJ5398]:Adore(状压DP+记忆化搜索)
题目描述 小$w$偶然间见到了一个$DAG$. 这个$DAG$有$m$层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有$k$个节点. 现在小$w$每次可以取反第$i(1<i< ...
- stella mccartney falabella foldover tote a few eye observed
Lately, the particular Heyuan City Courtroom retrial, in order to commit the criminal offense of cou ...
- HYSBZ 2145 悄悄话
2145: 悄悄话 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 271 Solved: 104[Submit][Status][Discuss] ...
- Chkrootkit Sourcecode Learning
目录 . Chkrootkit Introduce . Source Code Frame . chklastlog.c . chkwtmp.c . ifpromisc.c . chkproc.c . ...
- Rootkit Hunter Sourcecode Learning
目录 . Rootkit Hunter Introduce() . Source Code Frame() . do_system_check_initialisation() . do_system ...
随机推荐
- 使用ucontext组件实现的coroutine代码分析
coroutine一般翻译过来就是协程,类似于线程可以切换,而跟线程是由操作系统调度器来实现切换不一样,协程由用户程序自己调度进行切换.我以前也看过协程相关的内容,但没有自己去实现过.最近搞OpenS ...
- scala快速学习笔记(二):控制结构,类和对象
IV.控制结构 1.if/else 除基本用法外,if/else语句能用来赋值,进而代替?:运算符.这得益于在Scala中,每个语句块都有值,就是该语句块最后一个语句的值.请看下面的代码. def a ...
- GDI泄露+改EXE名
CDC 应该是成对使用 GetDC and ReleaseDC(不用new and delete) 泄露 1.改变生产exe名称:工程->设置->连接->输出文件名:Release/ ...
- Printf可变參数使用
參考文档: http://bbs.csdn.net/topics/70288067 Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源 本文的二 ...
- Pattern: Microservice Architecture
Microservice Architecture pattern http://microservices.io/patterns/microservices.html Context You ar ...
- PrintWrite
向文本输出流打印对象的格式化表示形式.此类实现在 PrintStream 中的所有 print 方法.它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入. 与 Print ...
- 分析PHP的include机制
php在解析include指令时,会对包含的文件路径做如下判断: 如果是绝对路径,则直接包含,并结束. 如果是相对路径,则做如下判断: 相对路径以特殊符号开头,如 "./1.php" ...
- Hadoop一些要注意的点
1.大多小文件的劣处: a. 生成更多的map任务,额外的开销: b. 每个文件都需要守址时间: c. HDFS上namenode需要占用内存空间:
- RK3288 GPIO 输出问题【转】
本文转载自:http://m.blog.csdn.net/jiangdou88/article/details/50158673 #define GPIO_BANK0 (0 ...
- hdu 4302 Holedox Eating(优先队列/线段树)
题意:一只蚂蚁位与原点,在x轴正半轴上会不时地出现一些蛋糕,蚂蚁每次想吃蛋糕时选取最近的去吃,如果前后距离相同,则吃眼前的那一块(即方向为蚂蚁的正前),求最后蚂蚁行进距离. 思路:优先队列q存储蚂蚁前 ...