\(\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的更多相关文章

  1. 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 ...

  2. 「ARC 139F」Many Xor Optimization Problems【线性做法,踩标】

    「ARC 139F」Many Xor Optimization Problems 对于一个长为 \(n\) 的序列 \(a\),我们记 \(f(a)\) 表示从 \(a\) 中选取若干数,可以得到的最 ...

  3. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  4. 【翻译】西川善司的「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,后篇

    http://www.4gamer.net/games/216/G021678/20140714079/     连载第2回的本回,  Arc System Works开发的格斗游戏「GUILTY G ...

  5. 「题解」「美团 CodeM 资格赛」跳格子

    目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...

  6. Android内存管理(4)*官方教程 含「高效内存的16条策略」 Managing Your App's Memory

    Managing Your App's Memory In this document How Android Manages Memory Sharing Memory Allocating and ...

  7. SSH连接时出现「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」解决办法

    用ssh來操控github,沒想到連線時,出現「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」,後面還有一大串英文,這時當然要向Google大神求助 ...

  8. 「Windows MFC 」「Edit Control」 控件

    「Windows MFC 」「Edit Control」 控件

  9. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

随机推荐

  1. PPT2010封面形状效果

    原文链接:https://www.toutiao.com/i6486787584457441805/ 一.填充一张背景图片 选择一张空白幻灯片,右键菜单,选择背景格式. 进入"设置背景格式& ...

  2. Elasticsearch基础知识学习

    概要 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Ap ...

  3. 开启mysql外部访问(root外连)

    MySQL外部访问 mysql 默认是禁止远程连接的,你在安装mysql的系统行运行mysql -u root -p 后进入mysql 输入如下: mysql>use mysql; mysql& ...

  4. Zookeeper介绍一

    Zookeeper是什么 ZooKeeper是一个开放源码的分布式协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作.最终,将简单易用的接口和性能高效.功能稳定 ...

  5. Protobuf使用--go和C#

    一.Go安装及使用protobuf工具 以下都是基于Linux系统: 1.安装 A) protobuf 编译工具安装 1.下载 protoBuf: cd $GOPATH/src/ git clone ...

  6. leetcode 206. 反转链表 及 92. 反转链表 II

    206. 反转链表 问题描述 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1-> ...

  7. SQLServer触发器调用JavaWeb接口

    这几天接到一个需求需要吧不同系统的数据库进行同步,需要我做一个中间平台进行连接,瞬间就想到了触发器调用接口然后通过API进行传递再写入另一个数据库. sqlServer触发器调用JavaWeb接口 1 ...

  8. 五天学完MySQL打卡挑战 day01

    明天继续上传学习笔记和练习的Word文档 晚安~

  9. java多态概述特点转型I

    1 package face_09; 2 3 import com.sun.jdi.Method; 4 5 /* 6 * 对象的多态性. 7 * class 动物 8 * {} 9 * 10 * cl ...

  10. linux字符编码防止乱码

    一:linux字符编码 en_US.UTF-8 : 美式英文,utf-8 zh_CN.UTF-8 临时优化 export LANG=zh_CN.UTF-8 : 设置编码 永久优化 vim /etc/l ...