[ARC 058 - E]Iroha and Haiku
解题步骤
首先可以发现题目范围非常小,尤其是\(X,Y,Z\),所以考虑类似状压、数位dp、双向搜索等算法。
官方题解中给的是数位dp,那我这里就讲讲状压了
对于\(N \leq 40\),很明显不能对其进行状压并且没意义,那么对于\(X,Y,Z\)呢?因为题目要求连续一段数满足要求,且\(X+Y+Z \leq 17,a_i \geq 1\),故只用考虑连续一段长度不超过17的的区间是否满足要求即可。
但是对于具体数值怎么状压呢?我们发现因为和不超过\(X+Y+Z\),所以我们可以对当前第\(i\)位前一段和不超过\(X+Y+Z\)的区间的每一个数\(a_j\)通过\(2^{a_j}\)表示,同时按顺序依次乘\(2^{a_i}\),如此既没改变相对顺序,又表示出数值,实现如下:
int tot = (1 << X + Y + Z) - 1;
int s = ((msk << j) | (1 << j - 1)) & tot;
/*
tot为全集
j为枚举当前位填入的元素
msk即为前一个状态元素集合
s则为加上当前元素j后的元素集合
*/
到这里,状压思路已经很清晰了,最后一个难点为判定满足条件。因为我们对于状压状态,发现一段前缀的和在不断位移的操作下变成了某一个元素在\(msk\)对应的单个\(1\),故目标可表示为(1<<X-1)|(1<<X+Y-1)|(1<<X+Y+Z-1),对于当前集合判断包不包含目标集合,如果包含,满足条件,反之不满足。
int targ = (1 << X - 1) | (1 << X + Y - 1) | (1 << X + Y + Z - 1), tot = (1 << X + Y + Z) - 1;
int s = ((msk << j) | (1 << j - 1)) & tot;
if ((s & targ) != targ)
dp[i][s] = (dp[i][s] + dp[i - 1][msk]) % mod;
/*
targ为目标集合
dp[i][msk]表示考虑第i位,前一段和不超过X+Y+Z的区间为msk的情况下,有多少种情况不满足条件
*/
最后做个解释,为什么dp[i][msk]要表示不满足条件的区间。因为对于初始状态,不满足条件的区间都由dp[0][0]演化而来,而满足条件的区间千变万化,可以从很多种情况转移,不好把握。
最终实现
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 45, TN = 17;
const LL mod = 1e9 + 7;
LL dp[N][1 << TN];
int X, Y, Z, n;
LL ans;
inline LL power(LL a, LL k) //可要可不要,直接O(N)把ans乘一遍也只是40
{
LL ret = 1;
while (k)
{
if (k & 1)
ret = ret * a % mod;
a = a * a % mod;
k >>= 1;
}
return ret;
}
int main()
{
scanf("%d%d%d%d", &n, &X, &Y, &Z);
dp[0][0] = 1;
ans = power(10ll, n);
int targ = (1 << X - 1) | (1 << X + Y - 1) | (1 << X + Y + Z - 1), tot = (1 << X + Y + Z) - 1;
//targ:目标集合 tot:全集
for (int i = 1; i <= n; i++)
for (int msk = 0; msk <= tot; msk++)
for (int j = 1; j <= 10; j++)
{
int s = ((msk << j) | (1 << j - 1)) & tot;
//加入当前元素后集合
if ((s & targ) != targ) //不满足条件
dp[i][s] = (dp[i][s] + dp[i - 1][msk]) % mod;
}
//dp第一层循环一定是1~n,因为第i位是该dp的一个阶段,所有第i层的状态都依赖于上一层
for (int msk = 0; msk <= tot; msk++)
ans = (ans - dp[n][msk] + mod) % mod;
printf("%lld", ans);
return 0;
}
[ARC 058 - E]Iroha and Haiku的更多相关文章
- 和風いろはちゃんイージー / Iroha and Haiku (ABC Edition) (水水)
题目链接:http://abc042.contest.atcoder.jp/tasks/abc042_a Time limit : 2sec / Memory limit : 256MB Score ...
- [Arc058E] Iroha and Haiku
[Arc058E] Iroha and Haiku 题目大意 问有多少\(n\)个数的正整数序列,每个数在\([1,10]\)之间,满足存在\(x,y,z,w\)使得\(x\to y-1,y\to z ...
- Solution -「ARC 058C」「AT 1975」Iroha and Haiku
\(\mathcal{Description}\) Link. 称一个正整数序列为"俳(pái)句",当且仅当序列中存在连续一段和为 \(x\),紧接着连续一段和为 \(y ...
- ARC 058
所以为啥要写来着........... 链接 T1 直接枚举大于等于$n$的所有数,暴力分解判断即可 复杂度$O(10n \log n)$ #include <cstdio> #inclu ...
- AtCoder Regular Contest
一句话题解 因为上篇AGC的写的有点长……估计这篇也短不了所以放个一句话题解方便查阅啥的吧QwQ 具体的题意代码题解还是往下翻…… ARC 058 D:简单容斥计数. E:用二进制表示放的数字,然后状 ...
- AtCoder Regular Contest 058
这个应该是第一场有英文的atcoder吧??不过题解却没有英文的... 从前往后慢慢做... C こだわり者いろはちゃん / Iroha's Obsession 数据范围这么小,直接暴力 #inclu ...
- AtCoder 瞎做
目录 ARC 058 E - 和風いろはちゃん / Iroha and Haiku 题意 题解 技巧 代码 ARC 059 F - バイナリハック / Unhappy Hacking 题意 题解 技巧 ...
- AtCoder-arc058(题解)
A - こだわり者いろはちゃん / Iroha's Obsession(暴力) 题目链接 题目大意: 给你 \(k\) 个个位数字和一个数字 \(n\) ,要求找到一个大于等于n的数字,使得不出现 \ ...
- csp退役前的做题计划1(真)
csp退役前的做题计划1(真) 因为我太菜了,所以在第一次月考就会退役,还是记录一下每天做了什么题目吧. 任务计划 [ ] Z算法(Z Algorithm) 9.28 [x] ARC061C たくさん ...
- 【AtCoder】ARC058
ARC058 C - こだわり者いろはちゃん / Iroha's Obsession 暴力一个个枚举是最简单的方式 #include <bits/stdc++.h> #define fi ...
随机推荐
- 微信小程序原生AI运动(动作)检测识别解决方案
前几年受疫情影响,人员流动受限,反而让"AI运动"概念风靡一时.空前火爆.目前已经在AI运动锻炼.体育教学.线上运动主题活动等场景中,成功得到了应用,并获得了广大互联网用户的认可. ...
- 在matlab中使用遗传算法执行最优化
遗传算法是一种通用的最优化方法,具体原理可以看:遗传算法详解与实验.下面记录在Matlab中如何使用遗传算法来做优化. 用法 调用方式如下: 1 x = ga(fun,nvars) 2 x = ga( ...
- bootstrap-fileinput使用手册
一.准备 1.插件下载地址:https://github.com/kartik-v/bootstrap-fileinput/ 下载后的压缩包解压文件夹内容如下: js:插件核心js代码,引用filei ...
- Git之message提交
作用 编写格式化的 commit message 能够大大提高代码的维护效率. 比如: 可以提供更多的历史信息,方便快速浏览: 可以过滤某些 commit(比如文档改动),便于快速查找信息: 可以直接 ...
- docker之网络与数据管理
docker默认使用bridge(单主机互联)和overlay(可跨主机互联)两种网络驱动来进行容器的网络管理.如需要,还可以自定义网络驱动插件进行docker容器的网络管理. 1.docker默认网 ...
- nginx之访问控制
Nginx的源码提供了ngx_http_auth_basic_module这个模块,它可以来解决web访问认证的问题.这个模块是默认就编译进nginx的,可以直接拿来使用. ngx_http_auth ...
- springboot 前后端大打包成一个JAR
1.概述 现在开发使用前后端开发机制,在部署的时候,我们需要将前后端分别打包,使用nginx 进行统一部署.这样就比较复杂,我们可以使用前后端打包到一个jar中,这样我们只需要一个包就可以了. 2.实 ...
- Epicor 10 SaaS云登录
随着云计算的普及,几乎所有的软件都可以云化了,但事实上,并没有.尤其是在管理软件领域起步较早的 ERP 似乎在云化的道路上一直步履蹒跚. 随着公共云的成熟,人们的观念已经改变.云计算和 SaaS 提供 ...
- uniapp开发鸿蒙,是前端新出路吗?
相信不少前端从业者一听uniapp支持开发鸿蒙Next后非常振奋.猫林老师作为7年前端er也是非常激动,第一时间体验了下.在这里也给大家分享一下我的看法 对于前端开发者而言,几乎无需增加额外的学习成本 ...
- Electron 通信
1.web向主进程发送消息 (单项) 使用ipcMain.on 监听事件 const hanle = (event, data) => { console.log(event) console. ...