Pythonで素数の配列の積が完全平方数かどうかを判定する方法
すべての要素が素数である配列 nums が与えられたとします。このとき、配列内の全要素の積が完全平方数(平方数)であるかどうかを判定する必要があります。
たとえば、入力が nums = [3,3,7,7] の場合、出力は True になります。すべての要素の積は 441 となり、21² = 441 であるため、441 は完全平方数だからです。
解法のアプローチ
この問題は、素因数分解の性質を使うことで効率的に解けます。ある数が完全平方数であるためには、その素因数の指数がすべて偶数でなければなりません。つまり、配列内の各素数の出現回数を数え、1つでも奇数回現れる素数が存在すれば、その積は完全平方数にはなりません。
手順は以下の通りです。
m:= 配列nums内の各要素とその出現頻度を保持するマップ(辞書)を作成します。numsの各キーについて次を繰り返します。m[key]が奇数であればFalseを返します。
- すべてのキーが偶数回出現していれば
Trueを返します。
この方法では、実際に大きな積を計算する必要がないため、桁あふれや多倍長整数演算のコストを避けられます。計算量は時間・空間ともに O(n) と効率的です。
実装例
以下の実装を見ると、より理解しやすくなります。
from collections import defaultdict
def solve(nums) :
m = defaultdict(int)
for key in nums :
m[key] += 1
for key in nums :
if m[key] % 2 == 1 :
return False
return True
nums = [3,3,7,7]
print(solve(nums))
入力
[3,3,7,7]
出力
True
-
【C++】配列内のすべての素数の積を求める方法
整数型配列 arr[] が与えられたとき、その配列に含まれるすべての素数を見つけ出し、それらの積を計算するのが本記事のテーマです。素数とは、1とその数自身でしか割り切れない正の整数のことです。たとえば、2、3、5、7、11などが素数に該当します。それでは、次の配列を例に解を求めてみましょう。入力: arr[] = { 11, 20, 31, 4, 5, 6, 70 }出力: 1705説明: 配列内の素数は 11、31、5 の3つであり、その積は 11 × 31 × 5 = 1705 となります。入力: arr[] = { 1, 2, 3, 4, 5, 6, 7 }出力: 210説明: 配列内の
-
【Python】自身を除く配列要素の積を除算なしで求める方法
問題の概要 n > 1 を満たす n 個の整数からなる配列 nums があるとします。ここで、output[i] が nums[i] 以外のすべての要素の積と等しくなるような配列 output を求めます。 例えば、入力配列が [1,2,3,4] の場合、出力は [24,12,8,6] となります。重要な制約として、この問題は除算演算子を使用せずに解く必要があります。 解法のアプローチ この問題は「右側からの累積積」と「左側からの累積積(プレフィックス)」を組み合わせることで効率的に解けます。各位置 i に対して、「左側の要素の積 × 右側の要素の積」を計算すればよいのです。 アルゴ