AtCoder真题及详细题解 ABC427B: Sum of Digits Sequence - 指南
AtCoder真题及详细题解 ABC427B: Sum of Digits Sequence
题目描述
对于正整数 x x x,定义 f ( x ) f(x) f(x) 为 x x x 的十进制表示中各位数字之和。例如, f(123) = 1 + 2 + 3 = 6 。
定义一个无限序列 A = ( A 0 , A 1 , A 2 , … ) A = (A_0, A_1, A_2, \ldots) A=(A0,A1,A2,…) 由以下公式给出:
- A 0 = 1 A_0 = 1 A0=1
- 对于 i ≥ 1 i \geq 1 i≥1, A i = ∑ j = 0 i − 1 f ( A j ) A_i = \displaystyle\sum_{j = 0}^{i - 1} f(A_j) Ai=j=0∑i−1f(Aj)
给定一个正整数 N N N,求 A N A_N AN 的值。
输入格式
输入从标准输入给出,格式如下:
N N N
输出格式
打印答案。
输入输出样例 1
输入 1
6
输出 1
23
输入输出样例 2
输入 2
45
输出 2
427
说明/提示
样例解释 #1
- A 0 = 1 A_0 = 1 A0=1
- A 1 = f ( A 0 ) = 1 A_1 = f(A_0) = 1 A1=f(A0)=1
- A 2 = f ( A 0 ) + f ( A 1 ) = 2 A_2 = f(A_0) + f(A_1) = 2 A2=f(A0)+f(A1)=2
- A 3 = f ( A 0 ) + f ( A 1 ) + f ( A 2 ) = 4 A_3 = f(A_0) + f(A_1) + f(A_2) = 4 A3=f(A0)+f(A1)+f(A2)=4
- A 4 = f ( A 0 ) + f ( A 1 ) + f ( A 2 ) + f ( A 3 ) = 8 A_4 = f(A_0) + f(A_1) + f(A_2) + f(A_3) = 8 A4=f(A0)+f(A1)+f(A2)+f(A3)=8
- A 5 = f ( A 0 ) + f ( A 1 ) + f ( A 2 ) + f ( A 3 ) + f ( A 4 ) = 16 A_5 = f(A_0) + f(A_1) + f(A_2) + f(A_3) + f(A_4) = 16 A5=f(A0)+f(A1)+f(A2)+f(A3)+f(A4)=16
- A 6 = f ( A 0 ) + f ( A 1 ) + f ( A 2 ) + f ( A 3 ) + f ( A 4 ) + f ( A 5 ) = 23 A_6 = f(A_0) + f(A_1) + f(A_2) + f(A_3) + f(A_4) + f(A_5) = 23 A6=f(A0)+f(A1)+f(A2)+f(A3)+f(A4)+f(A5)=23
因此, A 6 = 23 A_6 = 23 A6=23。
约束条件
- N N N 是介于 1 1 1 和 100 100 100 之间的整数,包括 1 1 1 和 100 100 100。
AC代码
#include <bits/stdc++.h>
using namespace std;
int n, a[110]; // 定义n和序列a,a[i]存储序列的第i项
// 计算x的各位数字之和
int f(int x) {
int sum = 0;
while (x) {
sum += x % 10; // 取个位数并累加
x /= 10; // 去掉个位数
}
return sum;
}
int main() {
cin >> n; // 读入n
a[0] = 1; // 初始化序列的第一项为1
// 计算序列的第1到第n项
for (int i = 1; i <= n; i++) {
a[i] = 0; // 初始化当前项为0
// 累加前i项(索引0到i-1)的各位数字之和
for (int j = 0; j < i; j++) {
a[i] += f(a[j]);
}
}
cout << a[n]; // 输出序列的第n项
return 0;
}
核心逻辑:
序列定义:
- A₀ = 1
- 对于i ≥ 1,Aᵢ = f(A₀) + f(A₁) + … + f(Aᵢ₋₁)
- 其中f(x)是x的各位数字之和
算法流程:
- 从A₀开始逐个计算序列项
- 对于每个Aᵢ,需要计算前面所有项的各位数字之和
- 使用双重循环:外层循环遍历每个位置,内层循环累加前面所有项的f值
时间复杂度:
- 外层循环:O(N)
- 内层循环:O(N)
- 总复杂度:O(N²),对于N≤100完全可行
文末福利:《12大高频考点专题集训》
https://edu.csdn.net/course/detail/40437 点击跳转到秘籍
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"############# 祝看到这篇秘籍的OIer: ###############";
cout<<"#### AC不是偶然,一等奖是必然!祝你AK全场! ########";
cout<<"############# 复赛夺魁,一等在手! #################";
return 0;
}

浙公网安备 33010602011771号