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 i1 A i = ∑ j = 0 i − 1 f ( A j ) A_i = \displaystyle\sum_{j = 0}^{i - 1} f(A_j) Ai=j=0i1f(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;
  }

核心逻辑:

  1. 序列定义

    • A₀ = 1
    • 对于i ≥ 1,Aᵢ = f(A₀) + f(A₁) + … + f(Aᵢ₋₁)
    • 其中f(x)是x的各位数字之和
  2. 算法流程

    • 从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;
  }
posted @ 2025-11-23 17:59  gccbuaa  阅读(5)  评论(0)    收藏  举报