【NOIP2017提高A组模拟10.7】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 取模。
状压dp
考虑用dp,
因为k<=10,而路径数只分奇偶,那可以用二进制来表示,
设\(f_{i,s}\)第i层的路径数状态位s的方案数。
根据边转移就可以了,
但是这样时间复杂度位\(O(n2^kk^2)\)
考虑优化,读入的每个点连出去的边都可以用二进制来表示,用位运算,这样就变成\(O(nk2^k)\)的了。
#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
const int maxlongint=2147483647;
const int mo=998244353;
const int N=10005;
using namespace std;
int f[N][1034];
int n,m,b[N][12][12],mi[12],fb[N][12][12],bb[N][12],bc[N][12];
int read(int &n)
{
char ch=' ';int q=0,w=1;
for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar());
if(ch=='-')w=-1,ch=getchar();
for(;ch>='0' && ch<='9';ch=getchar())q=(q<<1)+(q<<3)+ch-'0';n=q*w;return n;
}
int main()
{
mi[0]=1;
for(int i=1;i<=11;i++) mi[i]=mi[i-1]*2;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) read(b[1][1][i]),bb[1][1]+=b[1][1][i]*mi[i-1];
for(int i=2;i<=n-2;i++)
for(int j=1;j<=m;j++)
for(int k=1;k<=m;k++) read(b[i][j][k]),fb[i][k][j]=b[i][j][k],bb[i][j]+=b[i][j][k]*mi[k-1],bc[i][k]+=fb[i][k][j]*mi[j-1];
for(int i=1;i<=m;i++) read(b[n-1][i][1]),bb[n-1][i]+=b[n-1][i][1];
f[1][1]=1;
for(int i=1;i<=n-1;i++)
for(int j=0;j<=mi[m]-1;j++)
{
int t=f[i][j];
if(t)
{
int tt=0;
for(int k=1;k<=m;k++)
tt^=bb[i][k]*bool(mi[k-1]&j);
f[i+1][tt]=(1ll*f[i+1][tt]+t)%mo;
if(i==1 || i==n-1) continue;
tt=0;
for(int k=1;k<=m;k++)
tt^=bc[i][k]*bool(mi[k-1]&j);
f[i+1][tt]=(1ll*f[i+1][tt]+t)%mo;
}
}
printf("%lld",f[n][0]);
}
【NOIP2017提高A组模拟10.7】Adore的更多相关文章
- NOIP2017提高A组模拟10.6】Biology
题目 trie 暴力就是对于每个询问的T个字符串 第i个和第i+1个直接个从后暴力枚举每位是否相同, 但这个方法TLE 我们考虑是否可以用更快的方法来求出两个字符串的最长公共后缀. 我们把所有的字符串 ...
- JZOJ 5328. 【NOIP2017提高A组模拟8.22】世界线
5328. [NOIP2017提高A组模拟8.22]世界线 (File IO): input:worldline.in output:worldline.out Time Limits: 1500 m ...
- JZOJ 5305. 【NOIP2017提高A组模拟8.18】C (Standard IO)
5305. [NOIP2017提高A组模拟8.18]C (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Description ...
- 【NOIP2017提高A组模拟9.17】猫
[NOIP2017提高A组模拟9.17]猫 题目 Description 信息组最近猫成灾了! 隔壁物理组也拿猫没办法. 信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数) ...
- 【NOIP2017提高A组模拟9.17】组合数问题
[NOIP2017提高A组模拟9.17]组合数问题 题目 Description 定义"组合数"S(n,m)代表将n 个不同的元素拆分成m 个非空集合的方案数. 举个例子,将{1,2,3}拆分成2 个 ...
- JZOJ 【NOIP2017提高A组模拟9.14】捕老鼠
JZOJ [NOIP2017提高A组模拟9.14]捕老鼠 题目 Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕 ...
- JZOJ 100029. 【NOIP2017提高A组模拟7.8】陪审团
100029. [NOIP2017提高A组模拟7.8]陪审团 Time Limits: 1000 ms Memory Limits: 131072 KB Detailed Limits Got ...
- JZOJ 5329. 【NOIP2017提高A组模拟8.22】时间机器
5329. [NOIP2017提高A组模拟8.22]时间机器 (File IO): input:machine.in output:machine.out Time Limits: 2000 ms M ...
- JZOJ 5307. 【NOIP2017提高A组模拟8.18】偷窃 (Standard IO)
5307. [NOIP2017提高A组模拟8.18]偷窃 (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Description ...
随机推荐
- filebeat的层次架构图和配置部署 -- 不错的文档 - elasticsearch 性能调优 + Filebeat配置
1.fielbeat的组件架构-看出层次感 2.工作流程:每个harvester读取新的内容一个日志文件,新的日志数据发送到spooler(后台处理程序),它汇集的事件和聚合数据发送到你已经配置了Fi ...
- Partition to K Equal Sum Subsets
Given an array of integers nums and a positive integer k, find whether it's possible to divide this ...
- [转帖]开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
开源许可证GPL.BSD.MIT.Mozilla.Apache和LGPL的区别 https://www.geek-workshop.com/thread-1860-1-1.html liamj ...
- 解决远程连不到CentOS7虚拟机或ifconfig中没有ens33
在使用Secure CRT连接虚拟机连接不上,可能之前虚拟机关闭不当 登到虚拟机的中断使用ifconfig发现没有ens33 猜测是CentOS图形管理中的NetworkManager接管了网络配置, ...
- Luogu P4878 [USACO05DEC]布局
题目 差分约束模板. 注意判负环需要建一个超级源点到每个点连一条\(0\)的边.因为\(1\)不一定能到达所有的点. #include<bits/stdc++.h> #define pi ...
- # Tallest Cows(差分)
Tallest Cows(差分) n头牛,给出最高牛的位置和身高,其他牛身高未知,给出m对相对关系,表示可以相互看见当且仅当他们中间的牛都比他们矮.求每头牛身高最大值是多少. 差分数组的性质:前缀和为 ...
- JS实现把一个页面层数据传递到另一个页面的两种方式
本博客整理了两种方式从一个页面层向另一个页面层传递参数. 一. 通过cookie方式 1. 传递cookie页面的html,此处命名为a.html 请输入用户名和密码: <input id=&q ...
- Java Integer中的IntegerCache小记
同事今天给我发了一个关于Java拆装箱的ppt,里面有这么一段代码 Integer c = Integer.valueOf(3); Integer d = Integer.valueOf(3); ...
- C# 实体之间转换
记录一下方便自己下次使用 public class ConvertHelper { public static List<T2> ConvertToList<T1, T2>(L ...
- VS Code 配置碰到的问题
VS Code 呈现缩进参考线以及语法高亮改变 找到 首选项——>设置→搜索renderIntentGuides→将此选项改为true(默认为false),就可以了.