Adore

问题描述

小\(\text{w}\) 偶然间得到了\(1\)个 \(DAG\)。

这个 \(DAG\) 有 \(m\) 层,第\(1\)层只有\(1\)个源点,最后\(1\)层只有\(1\)个汇点,剩下的每\(1\)层都有 \(k\) 个

节点。

现在小\(\text{w}\) 每次可以取反第 \(i(1 < i < m - 1)\) 层和第 \(i + 1\) 层之间的连边。也就是把原本从

\((i, k_1)\) 连到 \((i + 1, k_2)\) 的边,变成从 \((i, k_2)\) 连到 \((i + 1, k_1)\)。

请问他有多少种取反的方案,把从源点到汇点的路径数变成偶数条?

答案对 \(998244353\) 取模。

输入格式

第一行两个整数 \(m\),\(k\)。

接下来 \(m - 1\) 行, 第一行和最后一行有 \(k\) 个整数 \(0\) 或 \(1\),剩下每行有 \(k^2\) 个整数 \(0\) 或 \(1\),第

\((j - 1) \times k + t\) 个整数表示 \((i, j)\) 到 \((i + 1, t)\) 有没有边。

输出格式

一行一个整数表示答案。

数据规模与约定

\(20\%\) 的数据满足\(m \le 10,k \le 2\)。

\(40\%\) 的数据满足\(m \le 10^3,k \le 2\)。

\(60\%\) 的数据满足\(m \le10^3,k \le 5\)。

\(100\%\) 的数据满足\(4 \le m \le 10^4,k \le 10\)。

Solution

如果你读懂了题目,那么应该不是那么难想。

如何保证偶数条?发现奇偶可以成为状态,于是状压。

令\(dp_{i,s}\)表示第\(i\)层节点状态为\(s\)的方案数

转移也不难,但是我比较傻写了一种\(O(mk^22^k)\)的辣鸡做法,成功只拿了\(60pts\)

如果二进制连边就可以做到\(O(mk2^k)\)了,有点轻微卡常还是注意一下。


Code:

#include <cstdio>
const int N=1e4+10;
const int mod=998244353;
int g[N][11][11],m,k,dp[N][1<<10],sta,ans;
int main()
{
scanf("%d%d",&m,&k);
for(int is,j=1;j<=k;j++)
{
scanf("%d",&is);
sta|=is<<j-1;
}
dp[2][sta]=1;
for(int i=2;i<m-1;i++)
{
int a[12]={0},b[12]={0};
for(int is,j=1;j<=k;j++)
for(int l=1;l<=k;l++)
{
scanf("%d",&is);
a[j]|=is<<l-1;
b[l]|=is<<j-1;
}
for(int s=0;s<1<<k;++s)
if(dp[i][s])
{
int t0=0,t1=0;
for(int l=1;l<=k;l++)
if(s>>l-1&1)
t0^=a[l],t1^=b[l];
(dp[i+1][t0]+=dp[i][s])%=mod;
(dp[i+1][t1]+=dp[i][s])%=mod;
}
}
sta=0;
for(int is,j=1;j<=k;j++)
{
scanf("%d",&is);
sta|=is<<j-1;
}
for(int s=0;s<1<<k;s++)
{
if(dp[m-1][s])
{
int t=0;
for(int i=1;i<=k;i++)
if(s>>i-1&1&&sta>>i-1&1)
t^=1;
if(!t) (ans+=dp[m-1][s])%=mod;
}
}
printf("%d\n",ans);
return 0;
}

2018.10.20

Adore 解题报告的更多相关文章

  1. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  2. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  3. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  4. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  5. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  6. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  7. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

  8. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  9. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

随机推荐

  1. linux wdcp3 上传大文件 服务器i/o错误

    在一次上传大文件时 提示 服务器i/o错误  找了些方法都没有解决 最后发现 wdcp3 面板 默认安装时  web服务器引擎是 nginx + apache 共用 而且 nginx 默认并没与安装  ...

  2. Java : 多态表现:静态绑定与动态绑定(向上转型的运行机制)

    本来想自己写写的,但是看到有人分析的可以说是很清晰了,故转过来. 原文地址:http://www.cnblogs.com/ygj0930/p/6554103.html 一:绑定 把一个方法与其所在的类 ...

  3. 2019-04-10 python入门学习——教材和工具准备

    # 从决定学习编程语言到正式做出计划挤出空余时间,历经一年半,因工作原因及生活原因不断搁浅,从湖北到浙江再回湖北,暂时稳定在一家小公司,从日常加班中压缩时间学习,于此记录学习进度.学习问题,在此过程中 ...

  4. CMDB介绍

    CMDB https://lupython.gitee.io/2018/05/05/CMDB%E4%BB%8B%E7%BB%8D/ 尚泽凯博客地址 传统运维与自动化运维的区别 传统运维: ​ 1.项目 ...

  5. PyCharm使用秘籍视频

    PyCharm使用视频上传至企鹅群公告 需要自行添加群获取

  6. ffmpeg安装配置以及库调用

    参考https://blog.csdn.net/jayson_jang/article/details/52329508 cd ffmpeg ./configure --enable-shared - ...

  7. (数据科学学习手札24)逻辑回归分类器原理详解&Python与R实现

    一.简介 逻辑回归(Logistic Regression),与它的名字恰恰相反,它是一个分类器而非回归方法,在一些文献里它也被称为logit回归.最大熵分类器(MaxEnt).对数线性分类器等:我们 ...

  8. 笔记-python-常见特殊变量

    笔记-python-常见特殊变量 类似__xx,以双下划线开头的实例变量名,就变成了一个私有变量(private),只有内部可以访问,外部不能访问: 类似__xx__,以双下划线开头,并且以双下划线结 ...

  9. java 单例模式(singleton)

    概念: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 要点: 1.某个类只有一个实例. 2.它必须自行创建这个示例. 3.必须自行向整个系统提供这个示例. 实现: 1.拥有一个私有的构造器. ...

  10. git删除本地及远程分支

    1. 删除本地分支: git branch -d branchName 2. 删除远程分支: // 方法一:将删除的本地分支推到远程(要删除的远程分支在本地有映射) git push origin : ...