数列 9, 33, 73, 129, ... の第n項を求めるC++プログラム
問題概要
この問題では、整数 N が与えられ、数列 9, 33, 73, 129, ... の第 n 項を求めることが課題となります。
具体例を使って問題を確認してみましょう。
入力
N = 4
出力
129
説明
数列は 9, 33, 73, 129, ... と続いており、4番目の項は 129 です。
解法のアプローチ
この問題を解く鍵となるのは、数列の一般項(第n項の公式)を導出することです。まず数学的に一般項を求め、その公式をプログラムに適用します。
まず、元の数列と、それを1項だけずらした数列の差を取ってみましょう。
Sum = 9 + 33 + 73 + … + t(n-1) + t(n) -Sum = 9 + 33 + … + t(n-2) + t(n-1) 0 = 9 + ((33 - 9) + (73 - 33) + … + (t(n) - t(n-1))) - t(n) t(n) = 9 + (24 + 40 + 56 + ….) ※ 24 + 40 + 56 + …. は初項24・公差16の等差数列です。
等差数列の和の公式を適用すると、一般項は次のように変形できます。
t(n) = 9 + [ ((n−1)/2) × (2×24 + (n−2)×16) ]
t(n) = 9 + [(n − 1) × (24 + (n − 2) × 8)]
t(n) = 9 + [(n − 1) × (8n + 8)]
t(n) = 9 + 8 × [(n − 1) × (n + 1)]
t(n) = 9 + 8 × (n2 − 12)
t(n) = 9 + 8n2 − 8
t(n) = 8n2 + 1
以上より、この数列の第 n 項は 「8n² + 1」 というシンプルな公式で表せることが分かりました。検算として n = 4 を代入すると、8 × 16 + 1 = 129 となり、正しい結果が得られます。
実装例
導出した公式を使ったプログラムの動作を見てみましょう。
#include <iostream>
using namespace std;
// 第n項を求める関数(一般項: 8n^2 + 1)
int findNthTerm(int n) {
return (8*n*n) + 1;
}
int main(){
int n = 12;
cout<<"The series is 9, 33, 73, 129...\n";
cout<<n<<"th term of the series is "<<findNthTerm(n);
return 0;
}
出力
The series is 9, 33, 73, 129... 12th term of the series is 1153
まとめ
数列の各項を順番に計算していく方法(O(N))と異なり、一般項 8n² + 1 を使えば、どれほど大きな n でも定数時間 O(1) で答えを求められます。「数列の規則性を数学的に分析し、公式へ落とし込む」というアプローチは、競技プログラミングでも非常に重要なテクニックなので、ぜひ覚えておきましょう。
-
C++で数列a、b、b、c、c、cのN番目の項を求めるプログラム
この問題では、数Nが与えられます。私たちのタスクは、C++で数列a、b、b、c、c、c…のN番目の項を求めるプログラムを作成することです。問題の説明次の数列のN番目の項を求めます。a、b、b、c、c、c、d、d、d、d、....(全N項)そのためには、この数列の一般項を見つける必要があります。具体例を使って問題を理解しましょう。入力:N = 7出力:d解法アプローチ数列の一般項を求めるには、まず数列を注意深く観察する必要があります。この数列は「a」が1個、「b」が2個、「c」が3個、「d」が4個…というように、同じ文字が増えていきながら繰り返される構成になっています。これは初項aと公差dがどち
-
C++で数列 1, 2, 11, 12, 21… のN番目の項を求めるプログラム
この問題では、数値 N が与えられ、C++を用いて数列 1, 2, 11, 12, 21… のN番目の項を求めるプログラムを作成します。 問題の概要 次の数列のN番目の項を求めます。 1, 2, 11, 12, 21, 22, 111, 112, …(第N項まで) この数列には一定のパターンが隠されており、それをもとに一般項を導き出す必要があります。 具体例を見てみましょう。 入力 N = 8 出力 112 解法のアプローチ 一般項を導くためには、まず数列を注意深く観察することが重要です。この数列には次のような特徴があります。 すべての項が「1」と「2」のみで構成されている。 各項の末尾の