ABC242 C~E

  • [C - 1111gal password](https://atcoder.jp/contests/abc242/tasks/abc242_c)
    • 题目大意
    • 输入格式
    • 输出格式
    • 样例
    • 分析
    • 代码
  • [D - ABC Transform](https://atcoder.jp/contests/abc242/tasks/abc242_d)
    • 题目大意
    • 输入格式
    • 样例
      • 样例输入1
      • 样例输出1
      • 样例输入2
      • 样例输出2
    • 分析
    • 代码
      • 代码1(标准)
      • 代码2(优化)
  • [E - (∀x∀)](https://atcoder.jp/contests/abc242/tasks/abc242_e)
    • 题目大意
    • 分析
    • 代码

C - 1111gal password

题目大意

给定正整数NNN,求符合下列条件的整数XXX的个数,对998244353998244353998244353取模:

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

2≤N≤1062\le N\le 10^62≤N≤106

输入格式

NNN

输出格式

输出答案。

样例

NNN 输出
444 203203203
222 252525
100000010000001000000 248860093248860093248860093

分析

根据乘法原理可得,符合条件的NNN位数最多有9N9^N9N个,显然不能暴力求解。
但是,由于每一位会被上一位所限制,所以我们很容易想到使用DP\text{DP}DP求解。
令f(i,j)=Xf(i,j)=Xf(i,j)=X的第iii位上出现jjj的可能数,易得:
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=19f(n,i)\sum\limits_{i=1}^9f(n,i)i=1∑9​f(n,i)即可。

代码

本代码运用了滚动表的优化,当然也可以直接开N×9N\times9N×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

题目大意

给定由ABC组成的字符串SSS。令S0=SS_0=SS0​=S,Si=Si−1S_i=S_{i-1}Si​=Si−1​将ABC分别替换为BCCAAB的新字符串。
回答QQQ个查询,第iii个查询的问题如下:

  • 求StiS_{t_i}Sti​​的第kik_iki​个字母。

1≤∣S∣≤1051\le |S|\le 10^51≤∣S∣≤105
1≤Q≤1051\le Q\le 10^51≤Q≤105
1≤ti≤10181\le t_i\le 10^{18}1≤ti​≤1018
1≤ki≤min(1018,Sti1\le k_i\le min(10^{18},S_{t_i}1≤ki​≤min(1018,Sti​​的长度)))

输入格式

SSS
QQQ
t1k1t_1~k_1t1​ k1​
⋮\vdots⋮
tQkQt_Q~k_QtQ​ kQ​

样例

样例输入1

ABC
4
0 1
1 1
1 3
1 6

样例输出1

A
B
C
B
  • S0=S_0=~S0​= ABC
  • S1=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)=(S0f(t,k)=(S_0f(t,k)=(S0​为AAA..时StS_tSt​的第kkk个字母,其中ABC分别对应0,1,20,1,20,1,2且kkk从000开始))),则通过找规律可得:
f(t,k)={0(t=0)g(0,t)(k=0)g(f(t−1,⌊k2⌋),(kmod2)+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)为字符ccc在A,B,C,A,...这个环中ccc后面的第xxx个字符,即g(c,x)=(c+x)mod3g(c,x)=(c+x)\bmod3g(c,x)=(c+x)mod3。
因此,我们只要求出xxx在SSS的哪个字符分解后的结果中,再计算fff即可。
答案为ans=g(f(t,(k−1)mod2t),S⌊k−12t⌋)\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太大导致REwhile(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∀)

题目大意

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

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

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

分析

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

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

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

代码

#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;
}

AtCoder Beginner Contest 242 C~E 题解相关推荐

  1. AtCoder Beginner Contest 246 A~E 题解 Bishop 2

    AtCoder Beginner Contest 246 A~E 题解 A Four Points 题意 给你矩形的三个顶点,输出剩下那个 思路 把横坐标和纵坐标分开,必会存在两个相同的数,横纵坐标就 ...

  2. AtCoder Beginner Contest 252 A~G 题解

    前言 这是我第一次写7题(A~G)的ABC题解,若有写得不好或者不到位的地方请多多指教,我将万分感激,感谢大家的支持! ABC252 A~G [A - ASCII code](https://atco ...

  3. AtCoder Beginner Contest 196 A~E题解

    ABC196 A~E [A - Difference Max](https://atcoder.jp/contests/abc196/tasks/abc196_a) 题目大意 输入格式 输出格式 样例 ...

  4. AtCoder Beginner Contest 177 A~D 题解

    ABC177 A~D [A - Don't be late](https://atcoder.jp/contests/abc177/tasks/abc177_a) 题目大意 输入格式 输出格式 样例 ...

  5. AtCoder Beginner Contest 168 C~D题解

    ABC168 C&D [C - : (Colon)](https://atcoder.jp/contests/abc168/tasks/abc168_c) 题目大意 输入格式 输出格式 样例 ...

  6. AtCoder Beginner Contest 242 C 1111gal password

    题目链接:C 1111gal password 题意:长度为n的数字,每一位数字满足1<=x<=9,|x1-x2|<=1,求出有多少个数字 题解:运用数位dp求解 #include& ...

  7. AtCoder Beginner Contest 250 C~E 题解

    ABC250 C~E [C - Adjacent Swaps](https://atcoder.jp/contests/abc250/tasks/abc250_c) 题目大意 输入格式 输出格式 样例 ...

  8. AtCoder Beginner Contest 192 A~D题解

    ABC192 A~D [A - Star](https://atcoder.jp/contests/abc192/tasks/abc192_a) 题目大意 输入格式 输出格式 样例 分析 代码 [B ...

  9. AtCoder Beginner Contest 254 A~E 题解

    ABC254 A~E [A - Last Two Digits](https://atcoder.jp/contests/abc254/tasks/abc254_a) 题目大意 输入格式 输出格式 样 ...

最新文章

  1. vue 定时循环 setInterval
  2. Android Studio添加文件注释头模板?
  3. 设计模式学习笔记——访问者模式(VIsitor)
  4. C#-通过OpcUA监控设备
  5. html5option的js代码,ng-option(示例代码)
  6. 查看redhat版本信息
  7. 将JAVA编译为EXE的几种方法
  8. java递归 treeview_treeview递归
  9. 4变形物体_Houdini基础(二)曲线变形物体
  10. MySQL--自增列学习
  11. Linux移植随笔:git的使用
  12. download plugin update site for offline installation
  13. java中d怎样转换D,如何将ZonedDateTime转换为date?
  14. HTML 提高页面加载速度的方法
  15. vscode怎么连接mysql_如何在VSCode连接使用MySQL数据库?
  16. 【Java编程思想】读书笔记(二)第六章---第十章
  17. MANIFEST.MF的文件的作用
  18. 《设计模式之禅》试评员名单公布
  19. 用计算机完成下表的视距测量计算公式,2012测量学计算题库及参考答案
  20. html文件设置成mac桌面,Mac软件教程:让你的Mac桌面放入无限多的文件

热门文章

  1. android工程师培训价格,徐州android工程师培训基地
  2. 把计算机器显示桌面,电脑显示器桌面过大怎么办
  3. 毕设 老年公寓管理系统
  4. 高校公寓管理系统的设计与实现
  5. 国科大学习资料--最优化计算方法(王晓)-期末考试真题1
  6. 生命科学名言01:物种起源
  7. 使用百度在网络上搜索资料 在计算机,利用百度搜索资料认识计算机.doc
  8. 决胜经典算法之选择排序
  9. 如何使用React Native构建新闻应用
  10. android 获取年月日