XORされた結果が合計と同じであるl-rペアの数を見つけるためのC++プログラム
N個の要素を持つ配列Aがあるとします。 A [l] XOR A [l + 1] XOR ... XOR A [r-1] XOR A [r] =A [l] +A[を満たす整数lとrのペアの数を見つける必要があります。 l + 1] + ...A[r]。
したがって、入力がA =[2、5、4、6]の場合、ペア(1,1)、(2,2)、(3,3)、(4、 4)および(1,2)。
ステップ
これを解決するには、次の手順に従います-
n := size of A Define some arrays of size (n + 1) each, a, s and sx for initialize i := 1, when i <= n, update (increase i by 1), do: a[i] := A[i - 1] s[i] := s[i - 1] + a[i] sx[i] := sx[i - 1] XOR a[i] res := 0 for initialize l := 1, when l <= n, update (increase l by 1), do: bg := l, en = n, r = l while bg <= en, do: mi := (bg + en) / 2 if s[mi] - s[l - 1] is same as (sx[mi] XOR sx[l - 1]), then: r := mi bg := mi + 1 Otherwise en := mi - 1 res := res + (r - l + 1) return res
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; int solve(vector<int> A){ int n = A.size(); vector<int> a(n + 1), s(n + 1), sx(n + 1); for (int i = 1; i <= n; i++){ a[i] = A[i - 1]; s[i] = s[i - 1] + a[i]; sx[i] = sx[i - 1] ^ a[i]; } int res = 0; for (int l = 1; l <= n; l++){ int bg = l, en = n, r = l; while (bg <= en){ int mi = (bg + en) / 2; if (s[mi] - s[l - 1] == (sx[mi] ^ sx[l - 1])){ r = mi; bg = mi + 1; } else en = mi - 1; } res += (r - l + 1); } return res; } int main(){ vector<int> A = { 2, 5, 4, 6 }; cout << solve(A) << endl; }
入力
{ 2, 5, 4, 6 }
出力
5
-
数の奇数因子の合計を見つけるためのC++プログラム
正の整数で与えられ、タスクは、数値の奇数因子を生成し、与えられた奇数因子の合計を見つけることです。 例 Input-: number = 20 Output-: sum of odd factors is: 6 Input-: number = 18 Output-: sum of odd factors is: 13 したがって、結果=1 + 5 =6 以下のプログラムで使用されるアプローチは次のとおりです − その数の奇数因子の合計を計算するための数を入力します 数字0と2は両方とも偶数であるため無視し、数字1は奇数であるため保存します ループを3から数値の平方根まで開始し
-
16進数から10進数のC++プログラム
16進数を入力として指定すると、タスクは指定された16進数を10進数に変換することです。 コンピューターの16進数は16を底とし、10進数は10を底とし、0〜9の値で表されますが、16進数は0〜15から始まる数字で、10はA、11はB、12はC、 Dとして13、Eとして14、Fとして15。 16進数を10進数に変換するには、次の手順に従います- 余りから右から左に数字を抽出し、それを0から始まる累乗で乗算し、(桁数)–1まで1ずつ増やします。 16進数から2進数に変換する必要があるため、8進数の基数は16であるため、累乗の基数は16になります。 指定された入力の桁にベースとパワーを掛け