C++で(1^n + 2^n + 3^n + 4^n)mod 5を効率的に求める方法
このチュートリアルでは、次の問題を解説します。
整数 n が与えられたとき、(1n+2n+3n+4n) % 5 の値を求める必要があります。
問題点:直接計算できない理由
n が大きくなると、(1n+2n+3n+4n) の値は爆発的に増大し、long long 型のような整数型にすら収まらなくなります。そのため、実際にべき乗を計算せずに済む別のアプローチが必要になります。
規則性の発見
まず、この式を n = 1, 2, 3, ..., 9 について実際に計算してみると、それぞれ次のような値が得られます。
10, 30, 100, 354, 1300, 4890, 18700, 72354, 282340
これらの結果の末尾の数字(下一桁)を注意深く観察してください。実は、4つごとに末尾の数字が同じパターンで繰り返されることが分かります。これがこの式の持つ周期性です。
つまり、式を実際に計算しなくても、次のように結論できます。
n % 4 == 0 の場合:(1n+2n+3n+4n) % 5 は 4
上記以外の場合:(1n+2n+3n+4n) % 5 は 0
なぜこの法則が成り立つのか
フェルマーの小定理より、5と互いに素な任意の整数 a に対して a4 ≡ 1 (mod 5) が成り立ちます。したがって、n が4の倍数のとき、各項は mod 5 ですべて 1 となり、合計は 4 になります。一方、n が4の倍数でない場合も、指数を mod 4 で考えることで、各項の和が必ず5の倍数になることを確認できます。
実装例
それでは、実際のコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
int findSequenceMod5(int n) {
// nが4の倍数なら4、そうでなければ0を返す
return (n % 4) ? 0 : 4;
}
int main() {
int n = 343;
cout << findSequenceMod5(n) << endl;
return 0;
}
出力結果
上記のコードを実行すると、次の結果が出力されます。
0
n = 343 の場合、343 % 4 = 3 となるため、結果は 0 になります。このアルゴリズムの計算量は O(1) であり、n がどれほど大きくても即座に答えを求められます。
まとめ
このように、一見巨大な数を扱う問題でも、数列の周期性や規則性を見抜くことで、効率的かつオーバーフローの心配なく解くことができます。本チュートリアルについて質問がある場合は、コメント欄でお知らせください。
-
C++で三角形の周囲の長さ(外周)を求める方法
この記事では、三角形の周囲の長さ(外周)とは何か、三角形の種類ごとの周囲の長さの公式、そしてC++でそれらを求めるプログラムの書き方について詳しく解説します。周囲の長さ(Perimeter)とは周囲の長さとは、図形の外側を1周したときの総距離のことです。基本的には、図形を構成するすべての辺の長さを足し合わせたものになります。三角形の周囲の長さ三角形は3つの辺を持つ図形であるため、その周囲の長さは3辺の長さの合計として求められます。公式:周囲の長さ = すべての辺の合計周囲の長さ = x + y + z三角形の周囲の長さを求めるC++プログラムサンプルコード#include <iostre
-
【C++入門】二次方程式のすべての解(根)を求めるプログラムの書き方
二次方程式は一般に ax2 + bx + c = 0 の形で表されます。この方程式の解(根)は、以下に示す有名な「解の公式」によって求めることができます。判別式による3つの場合分け二次方程式の解の性質は、判別式 D = b2 − 4ac の値によって、次の3通りに分類されます。b2 < 4ac の場合:解は実数にならず、虚数を含む複素数になります。b2 = 4ac の場合:解は実数となり、両方の解が同じ値(重解)になります。b2 > 4ac の場合:解は実数となり、異なる2つの実数解を持ちます。それでは、これらすべての場合に対応した、二次方程式の解を求めるC++プログラムを見ていき