Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで数の2乗が2つの数の積に等しい方法の数を見つけるプログラム


2つの配列nums1とnums2があるとすると、これら2つのルールに従って形成されたトリプレット(タイプ1とタイプ2)を見つける必要があります-

  • トリプレット(i、j、k)if nums1 [i] ^ 2 =nums2 [j] * nums2 [k]ここで、[0 <=i
  • トリプレット(i、j、k)if nums2 [i] ^ 2 =nums1 [j] * nums1 [k]ここで、[0 <=i

したがって、入力がnums1 =[7,4] nums2 =[5,2,8,9]のようである場合、タイプ1(1,1,2)、nums1のトリプレットがあるため、出力は1になります。 [1] ^ 2 =nums2 [1] * nums2 [2] =(16 =2 * 8)。

これを解決するには、次の手順に従います。

  • cnt1:=各要素とそのnums1の数を保持するマップ
  • cnt2:=各要素とそのnums2の数を保持するマップ
  • 関数triplets()を定義します。これにはarr1、arr2が必要です
  • ans:=0
  • arr1のitems()の各t、vについて、
    • k:=arr2 [t]ある場合はそれ以外の場合は、0
    • tmp:=k *(k-1)/ 2
    • sq:=t * t
    • arr2の各mについて、
      • m
      • tmp:=tmp +(存在する場合はarr2 [m]、それ以外の場合は0)*(存在する場合はarr2 [sq / mの商]、それ以外の場合は0)
  • ans:=ans + tmp * v
  • 回答を返す
  • メインの方法から、次の手順を実行します-
  • トリプレット(cnt1、cnt2)+トリプレット(cnt2、cnt1)を返す
  • 理解を深めるために、次の実装を見てみましょう-

    from collections import Counter
    def solve(nums1, nums2):
       cnt1 = Counter(nums1)
       cnt2 = Counter(nums2)
    
       def triplets(arr1, arr2):
          ans = 0
          for t, v in arr1.items():
             k = arr2.get(t, 0)
             tmp = k * (k - 1) // 2
             sq = t * t
             for m in arr2:
                if m < t and sq % m == 0:
                   tmp += arr2.get(m, 0) * arr2.get(sq // m, 0)
                ans += tmp * v
          return ans
    
       return triplets(cnt1, cnt2) + triplets(cnt2, cnt1)
    nums1 = [7,4]
    nums2 = [5,2,8,9]
    print(solve(nums1, nums2))

    入力

    [7,4],[5,2,8,9]

    出力

    2

    1. 合計がPythonで与えられる少数の数の積を見つけるプログラム

      数nがあり、それらの合計がnに等しくなるように、2つ以上の数を見つける必要があり、これらの数の積が最大化されると、積を見つける必要があります。 したがって、入力がn =12の場合、出力は81になり、3 + 3 + 3 + 3=12および3*3 * 3 * 3=81となります。 これを解決するには、次の手順に従います- 関数dp()を定義します。これにはnかかります nが0と同じ場合、 1を返す ans:=0 1からn+1の範囲のiの場合、実行 ans:=ansの最大値と(i * dp(n − i)) ansを返す メインの方法から、

    2. Pythonでメッセージをデコードできるいくつかの方法を見つけるためのプログラム

      a =1、b =2、...z =26のようなマッピングがあり、エンコードされたメッセージメッセージ文字列があるとすると、デコードできる方法の数を数える必要があります。 したがって、入力がmessage =222の場合、出力は3になります。これは、bbb、bv、vbの3つの方法でデコードできるためです。 これを解決するには、次の手順に従います- memo:=メッセージサイズ+1と同じサイズの0のリスト memo [0]:=1 memo [1]:=1(message [0]が「0」と同じでない場合)それ以外の場合は0 2からメッセージのサイズまでの範囲のiの場合、実