Solution -「ARC 058C」「AT 1975」Iroha and Haiku
\(\mathcal{Description}\)
Link.
称一个正整数序列为“俳(pái)句”,当且仅当序列中存在连续一段和为 \(x\),紧接着连续一段和为 \(y\),再紧接着连续一段和为 \(z\),其中 \(x,y,z\) 为给定正整数。计数长度为 \(n\),元素大小不超过 \(10\) 的俳句。
\(n\le40\),\(x+y+z\le17\)。
\(\mathcal{Solution}\)
通过俳句的特征(连续三段和的限制)来正向计数会重复:一个俳句可能有多段满足特征。正难则反,考虑计数不是俳句的序列数。
如何定义状态呢?我们把 “\(x+y+z\)” 展开称一条长度为 \(x+y+z\) 的链。序列中的每个数可以占领位置中的 \(1\sim10\) 个位置。我们就只关心三个段的结束位置是否是某个数的结束位置即可。把某个数的结束位置设为 \(1\),其余位置设为 \(0\),就得到了一个 \(01\) 状态。例如 \(x=2,y=3,z=2\),那么 \(0100101\) 或 \(0111111\) 是俳句。
于是,令 \(f(i,S)\) 表示前 \(i\) 个数,后缀状态为 \(S\) 的非俳句个数,转移时排除所有俳句状态即可。
复杂度 \(\mathcal O(10n\cdot2^{x+y+z})\)。
\(\mathcal{Code}\)
#include <cstdio>
const int MAXN = 40, MAXL = 17, MOD = 1e9 + 7;
int n, x, y, z, f[2][1 << MAXL];
inline void add_eq ( int& a, const int b ) { if ( ( a += b ) >= MOD ) a -= MOD; }
int main () {
scanf ( "%d %d %d %d", &n, &x, &y, &z );
int all = ( 1 << x + y + z ) - 1, ans = 1;
int haiku = ( 1 << x + y + z >> 1 ) | ( 1 << y + z >> 1 ) | ( 1 << z >> 1 );
f[0][0] = 1;
for ( int i = 0, t = 0; i < n; ++ i, t ^= 1, ans = ans * 10ll % MOD ) {
for ( int s = 0; s <= all; ++ s ) {
int& cur = f[t][s];
if ( ! cur ) continue;
for ( int j = 1, trs; j <= 10; ++ j ) {
trs = ( s << j | ( 1 << j >> 1 ) ) & all;
if ( ( trs & haiku ) ^ haiku ) add_eq ( f[t ^ 1][trs], cur );
}
cur = 0;
}
}
int sub = 0;
for ( int i = 0; i <= all; ++ i ) add_eq ( sub, f[n & 1][i] );
printf ( "%d\n", ( ans - sub + MOD ) % MOD );
return 0;
}
Solution -「ARC 058C」「AT 1975」Iroha and Haiku的更多相关文章
- Solution Set -「ARC 107」
「ARC 107A」Simple Math Link. 答案为: \[\frac{a(a+1)\cdot b(b+1)\cdot c(c+1)}{8} \] 「ARC 107B」Quadrup ...
- 「ARC 139F」Many Xor Optimization Problems【线性做法,踩标】
「ARC 139F」Many Xor Optimization Problems 对于一个长为 \(n\) 的序列 \(a\),我们记 \(f(a)\) 表示从 \(a\) 中选取若干数,可以得到的最 ...
- Solution -「CTS 2019」「洛谷 P5404」氪金手游
\(\mathcal{Description}\) Link. 有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...
- 【翻译】西川善司的「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,后篇
http://www.4gamer.net/games/216/G021678/20140714079/ 连载第2回的本回, Arc System Works开发的格斗游戏「GUILTY G ...
- 「题解」「美团 CodeM 资格赛」跳格子
目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...
- Android内存管理(4)*官方教程 含「高效内存的16条策略」 Managing Your App's Memory
Managing Your App's Memory In this document How Android Manages Memory Sharing Memory Allocating and ...
- SSH连接时出现「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」解决办法
用ssh來操控github,沒想到連線時,出現「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」,後面還有一大串英文,這時當然要向Google大神求助 ...
- 「Windows MFC 」「Edit Control」 控件
「Windows MFC 」「Edit Control」 控件
- 「ZJOI2019」&「十二省联考 2019」题解索引
「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...
随机推荐
- [ vue ] 自定义组件的 v-model 理解
需求场景描述: 1. 在父组件 myself.vue 里面定义数据 button_val 2. 在父组件 myself.vue.里面定义按钮,它的功能是吧 button_val 的值 -1 ---- ...
- SQL高级优化(二)之MySQL架构
一.架构 想要学好SQL优化就必须从对应数据库的基本架构开始学习 架构图如下 二.架构分析 1. 连接管理与安全验证 MySQL有连接池(Connection Pool)管理客户端的连接. ...
- JS获取树的父节点及祖先节点
主体函数 export function findAllParent (node, tree, parentNodes = [], index = 0) { if (!node || node.fid ...
- vscode设置vue结构的初始代码片段
{ "Print to console": { "prefix": "vue", "body": [ "< ...
- 【reverse】逆向1 数据宽度
[reverse]逆向1 数据宽度 前言 感觉学逆向的都是大佬,正好最近在看java视频的时候,发现讲课的老师居然是从逆向行业转行来的,顿时肃然起敬.于是想在暑假的最后发光发热,把逆向的基础知识学习稳 ...
- gin源码解读2-揭开gin的神秘面纱
数据如何在gin中流转 func main() { gin.SetMode(gin.DebugMode) // 设置为开发模式 router := gin.Default() _ = router.S ...
- 集合框架-TreeSet集合-二叉树
1 package cn.itcast.p5.treeset.demo; 2 3 import java.util.Iterator; 4 import java.util.TreeSet; 5 6 ...
- linux设置定时任务(全面解析教程)
目录 一:系统定时任务 二:系统定时任务配置文件(crontab) 三:增加定时任务 1.crontab -e 2.1.sh 3.2.txt 四:查看crontab定时任务 五:定时任务配置文件(ro ...
- 手把手教你用Strace诊断问题
手把手教你用Strace诊断问题 发表于2015-10-16 早些年,如果你知道有个 strace 命令,就很牛了,而现在大家基本都知道 strace 了,如果你遇到性能问题求助别人,十有八九会建议你 ...
- python24day
内容回顾 命名空间 组合 一个类的对象是另一个类对象的属性 两个类之间有 什么有什么二点关系:例:班级有学生 学生和课程.圆形和圆环.班级和课程 计算器 from functools import r ...