AtCoder Beginner Contest 242 C~E 题解

蓝牙功耗优化实战:连接蓝牙耳机时高耗电问题的深度排查与解决 连接任意一款蓝牙耳机, 进行插入实网SIM卡, 同时连接蓝牙耳机后, 进入IDLE模式, 测试时间为10分钟的测试结果, 平均电流毫安在8左右. 测试结果1: 平均电流 8.84mA 测试结果2: 平均电流 7.39mA 厘清问题: 由于出现上两幅图中 绿色线圈中的 20mA 左右高耗电时段, 从而将整体的平均电流抬高. 于是在记录IDLE下电流出现绿色线圈中的 20mA 左右高耗电时段, 同时录制UART1 Catcher log. Filter: MOD_BT/MOD_ATC. 阅读详情

C - 1111gal password

题目大意

给定正整数 N N N,求符合下列条件的整数 X X X的个数,对 998244353 998244353 998244353取模:

  • X X X是 N N N位的正整数
  • X X X的每一位数都在 [ 1 , 9 ] [1,9] [1,9]之间(0不行);
  • X X X的相邻两位数之差的绝对值不超过 1 1 1。

2 ≤ N ≤ 1 0 6 2\le N\le 10^6 2≤N≤106

输入格式

N N N

输出格式

输出答案。

样例

N N N输出
4 4 4 203 203 203
2 2 2 25 25 25
1000000 1000000 1000000 248860093 248860093 248860093

分析

根据乘法原理可得,符合条件的 N N N位数最多有 9 N 9^N 9N个,显然不能暴力求解。
但是,由于每一位会被上一位所限制,所以我们很容易想到使用 DP \text{DP} DP求解。
令 f ( i , j ) = X f(i,j)=X f(i,j)=X的第 i i i位上出现 j j j的可能数,易得:
f ( i , j ) = { 1 ( i = 1 ) f ( i − 1 , 1 ) + f ( i − 1 , 2 ) ( j = 1 ) f ( i − 1 , 8 ) + f ( i − 1 , 9 ) ( j = 9 ) f ( i − 1 , j − 1 ) + f ( i − 1 , j ) + f ( i − 1 , j + 1 ) ( i > 1 , 2 ≤ j ≤ 8 ) f(i,j)=\begin{cases} 1&(i=1)\\ f(i-1,1)+f(i-1,2)&(j=1)\\ f(i-1,8)+f(i-1,9)&(j=9)\\ f(i-1,j-1)+f(i-1,j)+f(i-1,j+1)&(i>1,2\le j\le8) \end{cases} f(i,j)=⎩⎪⎪⎪⎨⎪⎪⎪⎧​1f(i−1,1)+f(i−1,2)f(i−1,8)+f(i−1,9)f(i−1,j−1)+f(i−1,j)+f(i−1,j+1)​(i=1)(j=1)(j=9)(i>1,2≤j≤8)​
因此,直接输出 ∑ i = 1 9 f ( n , i ) \sum\limits_{i=1}^9f(n,i) i=1∑9​f(n,i)即可。

代码

本代码运用了滚动表的优化,当然也可以直接开 N × 9 N\times9 N×9大小的数组,但这样会导致内存占用大,不建议使用。

#include <cstdio>
#define MOD 998244353
using namespace std;

inline void mod(int& x)
{
	if(x >= MOD) x -= MOD;
}

int dp[9], ldp[9];

int main()
{
	int n;
	scanf("%d", &n);
	for(int i=0; i<9; i++)
		dp[i] = 1;
	while(--n)
	{
		for(int i=0; i<9; i++)
			ldp[i] = dp[i];
		mod(dp[0] += dp[1]), mod(dp[8] += dp[7]);
		for(int i=1; i<8; i++)
			mod(dp[i] += ldp[i - 1]),
			mod(dp[i] += ldp[i + 1]);
	}
	int ans = 0;
	for(int i=0; i<9; i++)
		mod(ans += dp[i]);
	printf("%d\n", ans);
	return 0;
}

D - ABC Transform

题目大意

给定由A、B、C组成的字符串 S S S。令 S 0 = S S_0=S S0​=S, S i = S i − 1 S_i=S_{i-1} Si​=Si−1​将A、B、C分别替换为BC、CA、AB的新字符串。
回答 Q Q Q个查询,第 i i i个查询的问题如下:

  • 求 S t i S_{t_i} Sti​​的第 k i k_i ki​个字母。

1 ≤ ∣ S ∣ ≤ 1 0 5 1\le |S|\le 10^5 1≤∣S∣≤105
1 ≤ Q ≤ 1 0 5 1\le Q\le 10^5 1≤Q≤105
1 ≤ t i ≤ 1 0 18 1\le t_i\le 10^{18} 1≤ti​≤1018
1 ≤ k i ≤ m i n ( 1 0 18 , S t i 1\le k_i\le min(10^{18},S_{t_i} 1≤ki​≤min(1018,Sti​​的长度 ) ) )

输入格式

S S S
Q Q Q
t 1   k 1 t_1~k_1 t1​ k1​
⋮ \vdots ⋮
t Q   k Q t_Q~k_Q tQ​ kQ​

样例

样例输入1

ABC
4
0 1
1 1
1 3
1 6

样例输出1

A
B
C
B
  • S 0 =   S_0=~ S0​= ABC
  • S 1 =   S_1=~ S1​= AABCB

样例输入2

CBBAACCCCC
5
57530144230160008 659279164847814847
29622990657296329 861239705300265164
509705228051901259 994708708957785197
176678501072691541 655134104344481648
827291290937314275 407121144297426665

样例输出2

A
A
C
A
A

注意小心整数溢出问题。

分析

令 f ( t , k ) = ( S 0 f(t,k)=(S_0 f(t,k)=(S0​为AAA..时 S t S_t St​的第 k k k个字母,其中A、B、C分别对应 0 , 1 , 2 0,1,2 0,1,2且 k k k从 0 0 0开始 ) ) ),则通过找规律可得:
f ( t , k ) = { 0 ( t = 0 ) g ( 0 , t ) ( k = 0 ) g ( f ( t − 1 , ⌊ k 2 ⌋ ) , ( k   m o d   2 ) + 1 ) ( t > 0 , k > 0 ) f(t,k)=\begin{cases} 0 & (t=0)\\ g(0,t) & (k=0)\\ g(f(t-1,\lfloor\frac k2\rfloor),(k\bmod2)+1) & (t>0,k>0) \end{cases} f(t,k)=⎩⎪⎨⎪⎧​0g(0,t)g(f(t−1,⌊2k​⌋),(kmod2)+1)​(t=0)(k=0)(t>0,k>0)​
其中 g ( c , x ) g(c,x) g(c,x)为字符 c c c在A,B,C,A,...这个环中 c c c后面的第 x x x个字符,即 g ( c , x ) = ( c + x )   m o d   3 g(c,x)=(c+x)\bmod3 g(c,x)=(c+x)mod3。
因此,我们只要求出 x x x在 S S S的哪个字符分解后的结果中,再计算 f f f即可。
答案为 a n s = g ( f ( t , ( k − 1 )   m o d   2 t ) , S ⌊ k − 1 2 t ⌋ ) \mathrm{ans}=g(f(t,(k-1)\bmod2^t),S_{\lfloor\frac {k-1}{2t}\rfloor}) ans=g(f(t,(k−1)mod2t),S⌊2tk−1​⌋​)。

代码

以下两种示范代码均使用非递归形式,当然也可使用递归形式。

代码1(标准)

#include <cstdio>
using namespace std;

char s[100005];

int main()
{
	scanf("%s", s);
	int q;
	scanf("%d", &q);
	while(q--)
	{
		long long t, k;
		scanf("%lld%lld", &t, &k);
		k --;
		int x = s[t < 64? k >> t: 0] - 'A'; // 防止t太大导致RE
		while(t > 0 && k > 0)
		{
			x = (x + int(k & 1LL) + 1) % 3;
			k >>= 1LL, t --;
		}
		putchar((t + x) % 3 + 'A');
		putchar('\n');
	}
	return 0;
}

代码2(优化)

#include <cstdio>
using namespace std;

char s[100005];

int main()
{
	scanf("%s", s);
	int q;
	scanf("%d", &q);
	while(q--)
	{
		long long t, k;
		scanf("%lld%lld", &t, &k);
		k --;
		int c = 0;
		if(t < 64)
		{
			c = s[k >> t] - 'A';
			k &= (1LL << t) - 1LL;
		}
		else c = s[0] - 'A';
		for(c+=t%3; k>0; k&=k-1) c ++;
		putchar(c % 3 + 'A');
		putchar('\n');
	}
	return 0;
}

E - (∀x∀)

题目大意

对于 T T T个测试点,分别解决下列问题:
给定整数 N N N和字符串 S S S,求合法字符串 X X X的个数,使其符合下列条件:

  • ∣ X ∣ = N |X|=N ∣X∣=N
  • X X X由大写英文字母组成,是一个回文串
  • 按字典序, X ≤ S X\le S X≤S

1 ≤ T ≤ 250000 1\le T\le 250000 1≤T≤250000
1 ≤ N ≤ 1 0 6 1\le N\le 10^6 1≤N≤106
1 ≤ ∑ N ≤ 1 0 6 1\le \sum N\le 10^6 1≤∑N≤106
∣ S ∣ = N |S|=N ∣S∣=N且由大写英文字母组成。

分析

显然,通过 X X X的前 ⌈ N 2 ⌉ \lceil\frac N2\rceil ⌈2N​⌉个字符就可以确定唯一的 X X X。下面,我们以ABCDE为例:

  • ABCDE的前 ⌈ N 2 ⌉ \lceil\frac N2\rceil ⌈2N​⌉个字符分别为ABC
  • 字典序小于ABC的字符串有 28 28 28个(可看作一个 26 26 26进制数来计算)
  • 判断ABCBA是否可行,与ABCDE比较
  • 可行,答案增加 1 1 1得到 29 29 29

因此,我们输出 29 29 29。其他情况类似。

代码

#include <cstdio>
#define maxn 1000005
#define MOD 998244353
using namespace std;

using LL = long long;
char s[maxn];

int main()
{
	int T;
	scanf("%d", &T);
	while(T--)
	{
		int n;
		scanf("%d%s", &n, s);
		long long x = 0LL;
		int j = n - 1 >> 1;
		for(int i=0; i<=j; i++)
			(x = x * 26LL + s[i] - 'A') %= MOD;
		bool ok = true;
		while(j >= 0)
		{
			if(s[j] < s[n - 1 - j]) break;
			if(s[j] > s[n - 1 - j]) { ok = false; break;}
			j --;
		}
		if(ok && ++x == MOD) x -= MOD;
		printf("%lld\n", x);
	}
	return 0;
}
44位abogus补环境与纯算逆向分析 44位ab参数补环境与纯算加密流程逆向分析 阅读详情

相关推荐

手机刷双系统

刷机教程(https://www.geekeyes.cn/forum.php/forum.php?mod=viewthread&amp;tid=492) 解锁教程(http://www.gioov.com/index.php/1386)   解锁教程 cmd下 进入adb目录( 如果环境变量配置了adb 可以直接在cmd 下输入命令) 手机连接电脑,确保usb 调试打开,然后手机连接电脑,...

超宇的博客 1万+

AtCoder Beginner Contest 242 补题记录

D - ABC Transform 解法:首先第0层是给定的字符串,然后,第t层可以看做是t个t层的完全二叉树,这样的话,最后一层的最大编号数为n*2^t,最大达到了1e5 * 2^(1e18),一个巨大的数字。但是显然给定的k范围没有这么大,所以要从k下手。 首先如果考虑朴素做法,从树底部往上一步一步走,是O(t)解法,过不了,但是可以通过k来剪枝,当t比较大的时候,k每次找父亲的时候会变成(k+1)/2,最多64次左右变成1,也就是第一个二叉树的最左边一列,容易发现最左边一列是有规律的,假如最左边字

bunny_1024的博客 593

从零搭建医疗化验单识别系统:深度学习+OCR实战教程(附数据集)

本文详细介绍了如何从零开始构建一个医疗化验单智能识别系统。通过融合深度学习和OCR技术,系统能够应对版式多样、内容专业的医疗单据,实现从文本检测、识别到关键信息结构化抽取的全流程。文章提供了数据集处理、模型选型、训练微调及工程化部署的实战指南,并分享了避坑经验与性能优化策略,为开发者解决医疗信息化痛点提供了完整的技术方案。

k9l0m1的博客 493

AtCoder ABC 244(A ~ E F待补)

AtCoder ABC 244 A - Last Letter(语法) Description: ​ 输出给定字符串的最后一个字符 Resolution ​ 过水 Code: void solve() { int n; string s; cin >> n; cin >> s; cout << s[n - 1]; } B - Go Straight and Turn Right(模拟) Description: ​ 对于给定操作序列 S

DM010maker的博客 670

TEC 高精度控温算法:实现精准升降温与恒温控制

本文深入解析了TEC高精度控温算法的核心原理与工程实践。针对TEC非线性、时变的特性,算法通过智能状态机实现精准升降温与恒温控制,并详细阐述了参数整定、硬件协同及调试优化的系统性方法,为半导体激光器、PCR仪等高精度温控应用提供了一套完整的解决方案。

weixin_29212867的博客 1013

Anaconda镜像源切换全攻略:从清华源到恢复默认设置的完整流程

本文详细介绍了Anaconda镜像源的管理与优化,重点讲解了如何配置清华源以提升国内下载速度。内容涵盖镜像源工作原理、清华源详细配置步骤、多源管理策略、常见问题排查以及如何安全恢复默认设置,帮助用户构建完整的镜像源管理体系。

weixin_28828243的博客 1021

AtCoder Beginner Contest 244 C~F题解

AtCoder Beginner Contest 244 C~F题解

weixin_63785821的博客 286

Java的API帮助文档

JDK帮助文档 SUN公司为JDK工具包提供了一整套文档资料,我们习惯上称之为JDK文档。 JDK文档中提供了Java中的各种技术的详细资料,以及JDK中提供的各种类的帮助说明。 JDk文档是Java语言的完整说明,大多数书籍中的类的介绍都要参照它来完成,它是编程者经常查阅的资料 如何理解API:就当做是一个“字典”,“使用手册”,API就相当于是一个电子的帮助文档,可以帮我们查看JDK提供的类的信息,平时查看的时候可结合百度一起看。 官网下载: 1、登录Oracle官网(Oracl.

人生得意须尽欢 2万+

AtCoder Beginner Contest 242(A-D.G莫队模板题)

A - T-shirt 选择结构 AC代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize("Ofast") #include<bits/stdc++.h> // #include <iostream> // #include <cstdio> // #include <queue> // #include <deque> // #include .

eyuhaobanga的博客 765

YOLOv9改进策略目录 | 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制

Hello,各位读者们好本专栏自开设两个月以来已经更新改进教程50余篇其中包含RepNCSPELAN4、主干、检测头、注意力机制、Neck多种结构上创新,也有损失函数和一些细节点上的创新。同时本人一些讲解视频和包含我所有创新的YOLOv9文档并不能在优快云上传(所有的创新点都经过我的测试是可用的,得到该文件之后大家可以随意组合使用),所以会建立群的形式在内上传我的文件和视频我也会在群内不定期和大家交流回答大家问题,同时定期会更新一些文章的创新点(经过我融合测试后的,先到先得)。

Snu77的博客 1万+

流体仿真软件:COMSOL Multiphysics二次开发_(11).COMSOL与外部软件的数据交换

通过上述方法,您可以实现 COMSOL Multiphysics 与外部软件的数据交换,从而更好地集成和分析仿真结果。无论是从文本文件导入数据,导出数据到 MATLAB,还是通过 API 和 COMSOL Server 实现实时通信,都能满足不同场景下的需求。希望这些内容对您在流体仿真领域的开发工作有所帮助。

kkchenjj的博客 1553

「Atcoder」abc242 题解

A - T-shirt Code void solve() { int a, b, c, x; cin >> a >> b >> c >> x; if(x <= a) printf("%.12lf\n", 1.0); else if(x <= b) { double res=c; res /= (b-a); printf("%.12lf\n",res);

CodeTty的博客 1061

自建 HTML获取腾讯六宫格点选图片验证码素材,实现刷新批量获取图片方便训练

通过自建 HTML 页面,可以方便地获取腾讯六宫格二维码素材,不仅过程简单,而且可以灵活配置各种参数。希望这篇文章能帮助到需要相关素材的小伙伴。如果你有其他问题或者更好的方法,欢迎留言交流!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 489

AtCoder Beginner Contest 242 C~E,G题解

AtCoder Beginner Contest 题解

weixin_63785821的博客 239

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

AtCoder Beginner Contest 242

AtCoder Beginner Contest 242

青少年趣味编程 588

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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,直接看...

橘嘉禾 157

Atcoder Beginner Contest 242(A-F)

Atcoder Beginner Contest 242 题解

Pt.ll的博客 962

AtCoder Beginner Contest 242(A-E)

A - T-shirt 题意: 输入四个整数a,b,c,x,已知自己的排名为x,当你排名在a之前一定会获得奖励,在a+1到b名之间有c/(b+1-a)的概率会获得奖励 思路: 看图说话 #include<bits/stdc++.h> using namespace std; int main() { int a,b,c,x; cin>>a>>b>>c>>x; if(x<=a){ cout

RIPKEY的博客 622

AtCoder Beginner Contest 242 题解

A - T-shirt 思路 要么一定得到,要么不可能得到,要么按题意概率直接列公式算概率 经验教训 无 AC代码 #define int long long void solve() { int a,b,c,x; cin>>a>>b>>c>>x; cout<<fixed<<setprecision(9); if (x<=a) cout<<1<<'\n';

qq_55852905的博客 1339

AtCoder Beginner Contest 242 G - Range Pairing Query (莫队)

每周五篇博客:(5/5) 我做到了!这题主要是想给大家提供一份莫队的板子,很多莫队题基本上填空就差不多了(

Resot的博客 797

AtCoder Beginner Contest 281 (E-F)

atcoder日常练习

scanner 361

AtCoder Beginner Contest 279 CDE题解

Atcoder 补题

weixin_63785821的博客 339

AtCoder Beginner Contest 281

对二进制位数进行考虑,对于每个Ai如果在第k位数上都为1或0,显然可以用x全部异或为0,如果不全为1或0,x就不能把每个Ai在这数位上消为0,这就可能对答案有贡献;转移f[i][j][k]=max(f[i][j][k],f[i-1][j][k]);删除:当到达第i个时,如果i>m,明显前i-1个不能保留在s1和s2中,因此删去。s1装前k个数,s1装待装入的数;dp,f[i][j][k]表示前i个数选了j个余k,增加:s1长度小于k时,直接从s2中insert,初始化f[i][j][k]=0。

weixin_63526687的博客 278
上一篇: AtCoder Beginner Contest 241 (Sponsored by Panasonic) D~F 题解
下一篇: 【Python】72行实现代码行数统计,简单实用~
GoodCoder666
博客等级 码龄7年 2320粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值