AtCoder Beginner Contest 242(C~E)
AB 水题
C - 1111gal password
题意:给出 N(\(2\le N\le 1e6\))求满足以下条件的 \(X\) 的数量,需除以模 (\(998244353\))
- $X $ 是 \(N\) 位数
- 对于 \(X_1,X_2,...,X_N\) 的每位数
- \(1\le X_i \le 9\)
- \(|X_i - X_{i+1}| \le 1\)
思路:
emm,直接看过去知道是比较明显的数论推导问题,随便写了几组发现当定义状态 \(f_{i,j}\) 表示长度为 \(i\) 符合条件的数字,结尾数位是 \(j\) 有多少个。递推式如下:
f_{i, j}=f_{i-1, j-1}+f_{i-1, j}+f_{i-1, j+1} \\
f_{i, 0}=f_{i, 10}=0 \\
f_{1, j}=1
\end{array}
\]
【AC Code】
const int N = 1e6 + 10, mod = 998244353;
ll n;
ll f[N][11];
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
cout << fixed << setprecision(20);
cin >> n;
for (int i = 1; i <= 9; i += 1) f[1][i] = 1;
for (int j = 2; j <= n; j++)
for (int i = 1; i <= 9; i++)
f[j][i] = (f[j - 1][i - 1] + f[j - 1][i] + f[j - 1][i + 1]) % mod;
// 定义初始和结尾以及初始值
// {1,2,3,4,5}, accumulate(a[0], a[5],0ll) = 15
cout << accumulate(f[n] + 1, f[n] + 10, 0ll) % mod;
}
D - ABC Transform
题意:
给定一个长度为 \(N\) 的字符串 \(S\) ,由A B C 三种字符组成,每一次变化会使 \(S\) 中的 A 全部变成 BC ,B 全部变成 CA ,C 全部变成 AB ,如 ABC 在一次变化后会变成 BCCAAB 。现在有 Q 个询问,每个询问都是求原串 \(S\) 经过 \(t_i\) 次变化后第 \(k_i\) 个字符
分析:
首先可以看出一个字符执行了 \(t\) 次操作以后的长度是好计算的,所以我们先把问题变成一个字符执行 \(t\) 次操作之后的第 \(k\) 个是什么。
上面的东西可以考虑作为递归做,即定义函数类似 \(f(c,t,k)\) 表示字符 \(c\) 执行了 \(t\) 次操作得到的字符串第 \(k\) 个是什么,只是存在一个问题:\(t(\le 1e18)\) 太大了
观察到每次操作会把字符串长度加倍,所以执行很少操作后,就变成了对 \(f(c,t,1)\) 求值。然而操作三次以后第一个字符等价于没有改变,所以可以直接得到结果。
Update:发现原思路虽然正确但有点绕
令 $f(t,k) $ 为原 \(S\) 经过 \(t_i\) 次变化后得到的 \(k_i\) 字符
首先,当 \(t=0\) 时,直接输出 \(S_k\) 即可
其次,当 \(t \not= 0\) ,我们需要知道 \(f(t,k)\) 从何而来
样例
ABC ->
BCCAAB ->
CAABABBCBCCA
采用分类讨论的方法,不难发现
- 当 $ k\in {2m+1 | m\in Z}$ (即 \(k\) 为奇数时),\(f(t - 1, \frac{k + 1}2) \to f(t,k)\)
- 当 $ k\in {2m | m\in Z}$ (即 \(k\) 为偶数时),\(f(t - 1, \frac{k}2) \to f(t,k)\)
怎么进行变化?
可以概阔为一个 \(g\) 函数:
inline char g(char ch, int x) { return (ch - 'A' + x) % 3 + 'A';}
但是,如果我们每一次都去递归 \(t\) 还是太大了,直接炸了。那么只能动 \(k\) 了
观察样例中字符串首,它们是 A B C 轮换的。
利用这条性质,当 \(k=0\) 即可直接求 \(f(t,0) = g(S.front(),t mod 3)\)
但是问题来了,这样一个算法肯定会对 \(k\) 取模,万一 \(k = 0...\)
所以,我们把 \(S\) 的改为编号 \(0 \to N-1\)
此时:
- 当 $ k\in {2m+1 | m\in Z}$ (即 \(k\) 为奇数时),\(f(t - 1, \frac{k - 1}2) \to f(t,k)\)
- 当 $ k\in {2m | m\in Z}$ (即 \(k\) 为偶数时),\(f(t - 1, \frac{k}2) \to f(t,k)\)
代码就很好写了
string s;
ll q, t, k;
inline char g(char ch, int x) { return (ch - 'A' + x) % 3 + 'A';}
char f(ll t, ll k) {
if (!t) return s[k];
if (!k) return g(s[0], t % 3);
return g(f(t - 1, k >> 1), (k & 1) + 1);
}
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
cout << fixed << setprecision(20);
cin >> s >> q;
while (q --) {
cin >> t >> k;
cout << f(t, k - 1) << "\n";
}
}
E - (∀x∀)
title 好玩
我们可以枚举两个字符串相同的前缀有多长,然后在后一个位置给串 \(X\) 填更小的字符,再之后的位置可以随便填了。
- 需要判断 \(X\) 的前半段全部和 \(S\) 相同时,后半段是否小于等于 \(S\)。
const int N = 1e6, mod = 998244353;
ll pw[N + 10] = {1};
string s;
int T, n;
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
cout << fixed << setprecision(20);
for (int i = 1; i <= N; i += 1) pw[i] = pw[i - 1] * 26ll % mod;
cin >> T;
while (T--) {
cin >> n >> s;
s = "@" + s;
int ans = 0;
bool f = 1;
for (int i = 1; i <= (n + 1) / 2; i++) {
int a = s[i] - 'A', b = s[n + 1 - i] - 'A';
ans = (ans + (ll)a * pw[(n + 1) / 2 - i]) % mod;
f &= a <= b;
f |= a < b;
}
cout << (ans + f) % mod << "\n";
}
}
AtCoder Beginner Contest 242(C~E)的更多相关文章
- Atcoder Beginner Contest 147C(状态压缩)
最多15个人,用N个二进制的数字表示每个人的状态,然后检验.这串数字相当于已经把这些人的状态定了下来,如果和输入的情况不符则这串数字不正确,直接忽略,因为枚举了所有的情况,所以总有正确的,不必在错误的 ...
- AtCoder Beginner Contest 254(D-E)
Tasks - AtCoder Beginner Contest 254 D - Together Square 题意: 给定一个N,找出所有不超过N的 ( i , j ),使得( i * j )是一 ...
- AtCoder Beginner Contest 086 (ABCD)
A - Product 题目链接:https://abc086.contest.atcoder.jp/tasks/abc086_a Time limit : 2sec / Memory limit : ...
- AtCoder Beginner Contest 085(ABCD)
A - Already 2018 题目链接:https://abc085.contest.atcoder.jp/tasks/abc085_a Time limit : 2sec / Memory li ...
- AtCoder Beginner Contest 084(AB)
A - New Year 题目链接:https://abc084.contest.atcoder.jp/tasks/abc084_a Time limit : 2sec / Memory limit ...
- AtCoder Beginner Contest 083 (AB)
A - Libra 题目链接:https://abc083.contest.atcoder.jp/tasks/abc083_a Time limit : 2sec / Memory limit : 2 ...
- AtCoder Beginner Contest 264(D-E)
D - "redocta".swap(i,i+1) 题意: 给一个字符串,每次交换相邻两个字符,问最少多少次变成"atcoder" 题解: 从左到右依次模拟 # ...
- Atcoder Beginner Contest 121D(异或公式)
#include<bits/stdc++.h>using namespace std;int main(){ long long a,b; cin>>a>&g ...
- Atcoder Beginner Contest 156E(隔板法,组合数学)
#define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; ; ; long long fac[N] ...
- Atcoder Beginner Contest 155E(DP)
#definde HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; ]; int main(){ ios: ...
随机推荐
- 🔥🔥Java开发者的Python快速进修指南:迭代器(Iterator)与生成器
这一篇内容可能相对较少,但是迭代器在Java中是有用处的.因此,我想介绍一下Python中迭代器的使用方法.除了写法简单之外,Python的迭代器还有一个最大的不同之处,就是无法直接判断是否还有下一个 ...
- 从0到1,手把手带你开发截图工具ScreenCap------001实现基本的截图功能
ScreenCap---Version:001 说明 从0到1,手把手带你开发windows端的截屏软件ScreenCap 当前版本:ScreenCap---001 支持全屏截图 支持鼠标拖动截图区域 ...
- SpringCore完整学习教程5,入门级别
本章从第6章开始 6. JSON Spring Boot提供了三个JSON映射库的集成: Gson Jackson JSON-B Jackson是首选的和默认的库. 6.1. Jackson 为Jac ...
- free内存参数介绍
第一部分Mem行: total 内存总数: 15.7G used 已经使用的内存数: 15.6G free 空闲的内存数: 93M shared 当前已经废弃不用,总是0 buffers Buffer ...
- UMP系统功能
1.容灾: 主库发生故障,执行从库 主从切换: 主库恢复:(切换过程中有短暂的不可用) 2.读写分离 3.分库分表: 当采用分库分表时,系统处理用户查询的过程如下: 4.资源管理: 具体的MySQL实 ...
- Celery架构和主要模块
**任务模块 ** 包含异步任务和定时任务.其中,异步任务通常在业务逻辑中被触发并发往任务队列,而定时任务由 Celery Beat 进程周期性地将任务发往任务队列. **消息中间件 Broker * ...
- 2023计算机保研经验贴 直博向(南大cs,计算所,科大高研院,浙大cs,交大cs,国科cs,北大cs,清华cs)
写在前面 本人作为普通选手,只能将个人经验分享一二,不能代表其他人的想法和意见,望路过的大佬们高抬贵手-,如果有相关老师或者同学认为我违反了保密条例请与我私信联系,我会第一时间删除相关内容. 个人情况 ...
- MySQL 基础(一)数据存储
存储在磁盘上的数据需要通过 IO 来读取,这是一个比较耗时的操作,为了能够提高访问速度,MySQL 引入了 Page 的结构作为客户端与数据交互的基本单元. Page 结构 Page 的大小默认为 1 ...
- Centos 利用本地镜像安装yum源
前提 在"设置"中确保两点 1.勾选"已连接" 2.添加上本地的"centos.iso"镜像文件 切换到用户目录 cd / 新建一个iso目 ...
- GitHub OAuth2的授权指南
一.OAuth2简介 OAuth 2.0(开放授权 2.0)是一种用于授权的开放标准,旨在允许用户在不提供他们的用户名和密码的情况下,授权第三方应用访问其在另一网站上的信息.它是在网络服务之间安全地共 ...