题目描述
给定一个数组arr,返回不包含本位置值的累乘数组
例如,arr=[2,3,1,4],返回[12, 8, 24, 6],即除自己外,其他位置上的累乘
[要求]
时间复杂度为O(n)O(n),额外空间复杂度为O(1)O(1)
输入描述:
第一行有两个整数N, P。分别表示序列长度,模数(即输出的每个数需要对此取模)
接下来一行N个整数表示数组内的数
输出描述:
输出N个整数表示答案
示例1
输入
复制
4 100000007
2 3 1 4
输出
复制
12 8 24 6
#include<iostream>
#include<stdio.h>
using namespace std;
typedef long long ll;
int arr[100007];
ll l_r[100007];//从左到右的累乘积%mod
ll r_l[100007];//从右到左的累乘积%mod
int main()
{
int n,mod;
cin>>n>>mod;
l_r[0]=1,l_r[n+1]=1,r_l[0]=1,r_l[n+1]=1;
for(int i=1;i<=n;i++)
{
cin>>arr[i];
l_r[i]=l_r[i-1]*arr[i]%mod;
}
for(int i=n;i>=1;i--)
{
r_l[i]=r_l[i+1]*arr[i]%mod;
}
for(int i=1;i<=n;i++)
{
cout<<l_r[i-1]*r_l[i+1]%mod<<" ";
}
return 0;
}