不包含本位置值的累乘陣列

2021-10-25 09:38:05 字數 1560 閱讀 8836

不包含本位置值的累乘陣列

給定乙個陣列arr,返回不包含本位置值的累乘陣列

例如,arr=[2,3,1,4],返回[12, 8, 24, 6],即除自己外,其他位置上的累乘

[要求]

時間複雜度為o(n

)o(n)

o(n)

,額外空間複雜度為o(1

)o(1)

o(1)

輸入描述:

第一行有兩個整數n, p。分別表示序列長度,模數(即輸出的每個數需要對此取模)

接下來一行n個整數表示陣列內的數

輸出描述:

輸出n個整數表示答案

示例1輸入

4 100000007

2 3 1 4

輸出
12 8 24 6
備註:

1 ⩽n

⩽105

1 \leqslant n \leqslant 10^5

1⩽n⩽1051⩽

p⩽10

9+

71 \leqslant p \leqslant 10^9 +7

1⩽p⩽10

9+7

1 ⩽a

rri⩽

10

91 \leqslant arr_i \leqslant 10^9

1⩽arri

​⩽10

9題解:

解法一:

所有非零元素的乘積記為 all ,若陣列中不含 0 ,則每個位置的結果為 all / a[i] ,若有 1 個0,對唯一的 a[i] == 0 的位置令 ret[i] = all,其它位置上的元素都是 0 ,若 0 的個數大於 1 ,則所有位置上的值都是 0 。

這種方法實現需要用到除法,因為需要取模運算,需要用到逆元,太麻煩,略過。。。

解法二:

記錄每個元素左邊和右邊元素的乘積,則最終結果就是每個位置左右陣列乘積相乘。

解法二**:

#include

using

namespace std;

const

int n =

100000

;typedef

long

long ll;

int n, p;

int a[n]

;ll ret[n]

;int

main

(void

) ll ans =1;

for(

int i = n -

1; i >0;

--i )

ret[0]

= ans % p;

for(

int i =

0; i < n;

++i )

printf

("%lld%c"

, ret[i]

," \n"

[i == n -1]

);}

CD 35不包含本位置值的累乘陣列

題目描述 給定乙個陣列arr,返回不包含本位置值的累乘陣列 例如,arr 2,3,1,4 返回 12,8,24,6 即除自己外,其他位置上的累乘 要求 時間複雜度為o n o n 額外空間複雜度為o 1 o 1 輸入描述 第一行有兩個整數n,p。分別表示序列長度,模數 即輸出的每個數需要對此取模 接...

hpuoj 1034 交換最值的位置 陣列

welcome to hpu online judge!時間限制 1 sec 記憶體限制 128 mb 提交 298 解決 94 給定乙個序列,現在讓你交換序列最大值和最小值的位置,並輸出交換後的序列。第一行輸入乙個整數t 代表有t 組測試資料。每組資料第一行輸入乙個整數n 代表序列有n 個元素。接...

js 根據值來查詢所在陣列的位置(索引值)

一 indexof 方法可返回某個指定的字串值在字串中首次出現的位置。indexof 方法可返回陣列中某個指定的元素位置。該方法將從頭到尾地檢索陣列,看它是否含有對應的元素。開始檢索的位置在陣列 start 處或陣列的開頭 沒有指定 start 引數時 如果找到乙個 item,則返回 item 的第...