题解 | #不包含本位置值的累乘数组#
不包含本位置值的累乘数组
http://www.nowcoder.com/practice/49e3976085524094ac11c6c9b5c07a9d
具体思路看注释呀!!!(^▽^)
#include <iostream> #include <vector> //重点在于输入数据非常大,一旦发生乘积,将会导致数据溢出,返回数据将不正确 //具体思路为: /* 1.计算当前数arr[i]左边的所有累乘结果,结果保留在lr[i]中 2.计算当前数arr[i]右边的所有累乘结果,结果保留在rl[i]中 3.arr[0] 没有左边数据,arr[n-1]没有右边数据,因此lr[0] rl[n-1]设为1 4.返回lr[i]*rl[i] 代表当前数左边的所有数乘积乘以当前数右边所有数的乘积 等价于除当前数以外所有数的乘积 注意取模,防止越界!!!! */ using namespace std; int main() { int n, p; while (cin >> n >> p) { vector<long long> arr(n,0); for (int i = 0; i < n; i++) { cin >> arr[i]; } vector<long long> lr(n, 1); vector<long long> rl(n, 1); //左边累乘 lr[0] = 1; for (int i = 1; i < n ; i++) { lr[i] = (lr[i - 1] * arr[i-1]) % p; } //右边累乘 rl[n - 1] = 1; for (int i = n - 2; i >= 0; i--) { rl[i] = (rl[i+1] * arr[i+1]) % p; } //返回最终结果 for (int i = 0; i < n; i++) { cout << (rl[i] * lr[i]) % p << " "; } } return 0; }