AtCoder真題及詳細題解 ABC427B: Sum of Digits Sequence

題目描述

對於正整數 AtCoder Beginner Contest 247 題解_輸入輸出,定義 AtCoder Beginner Contest 247 題解_輸入輸出_02AtCoder Beginner Contest 247 題解_輸入輸出

定義一個無限序列 AtCoder Beginner Contest 247 題解_初始化_04

  • AtCoder Beginner Contest 247 題解_初始化_05
  • 對於 AtCoder Beginner Contest 247 題解_初始化_06AtCoder Beginner Contest 247 題解_#include_07

給定一個正整數 AtCoder Beginner Contest 247 題解_#include_08,求 AtCoder Beginner Contest 247 題解_初始化_09

輸入格式

輸入從標準輸入給出,格式如下:

AtCoder Beginner Contest 247 題解_#include_08

輸出格式

打印答案。

輸入輸出樣例 1
輸入 1
6
輸出 1
23
輸入輸出樣例 2
輸入 2
45
輸出 2
427
説明/提示
樣例解釋 #1
  • AtCoder Beginner Contest 247 題解_初始化_05
  • AtCoder Beginner Contest 247 題解_輸入輸出_12
  • AtCoder Beginner Contest 247 題解_#include_13
  • AtCoder Beginner Contest 247 題解_#include_14
  • AtCoder Beginner Contest 247 題解_#include_15
  • AtCoder Beginner Contest 247 題解_#include_16
  • AtCoder Beginner Contest 247 題解_初始化_17

因此,AtCoder Beginner Contest 247 題解_輸入輸出_18

約束條件
  • AtCoder Beginner Contest 247 題解_#include_08 是介於 AtCoder Beginner Contest 247 題解_#include_20AtCoder Beginner Contest 247 題解_初始化_21 之間的整數,包括 AtCoder Beginner Contest 247 題解_#include_20AtCoder Beginner Contest 247 題解_初始化_21

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的各位數字之和
  1. 算法流程
  • 從A₀開始逐個計算序列項
  • 對於每個Aᵢ,需要計算前面所有項的各位數字之和
  • 使用雙重循環:外層循環遍歷每個位置,內層循環累加前面所有項的f值

時間複雜度:

  • 外層循環:O(N)
  • 內層循環:O(N)
  • 總複雜度:O(N²),對於N≤100完全可行