首页 > 试题广场 >

不包含本位置值的累乘数组

[编程题]不包含本位置值的累乘数组
  • 热度指数:3344 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个数组arr,返回不包含本位置值的累乘数组
例如,arr=[2,3,1,4],返回[12, 8, 24, 6],即除自己外,其他位置上的累乘
[要求]
时间复杂度为,额外空间复杂度为


输入描述:
第一行有两个整数N, P。分别表示序列长度,模数(即输出的每个数需要对此取模)
接下来一行N个整数表示数组内的数


输出描述:
输出N个整数表示答案
示例1

输入

4 100000007
2 3 1 4

输出

12 8 24 6

备注:


import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		int n = scanner.nextInt();
        int p = scanner.nextInt();
        long[] arr = new long[n];
        for(int i=0;i<n;i++){
            arr[i] = scanner.nextInt();
        }
       
        long[] lr = new long[n];
        long[] rl = new long[n];
        
        lr[0]=1;
        rl[n-1]=1;
        for(int i=1;i<n;i++){
            lr[i] = lr[i-1] * arr[i-1] % p;
        }
        for(int i=n-2;i>=0;i--){
            rl[i] = rl[i+1] * arr[i+1] % p;
        }
        
        for(int i=0;i<n;i++){
            System.out.print(lr[i]*rl[i]%p+" ");
        }
        
	}
}

发表于 2019-10-24 19:32:19 回复(0)
空间复杂度O(1)是怎么做到的?本菜鸡只能O(n)啊T^T
构建一个左累乘数组leftMulti和一个右累乘数组rightMultileftMulti[i]表示arr[i]左边所有数的乘积,rightMulti[i]表示arr[i]右边所有数的乘积。最后再挨个输出leftMulti[i]*rightMulti[i]即可。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] params = br.readLine().trim().split(" ");
        int n = Integer.parseInt(params[0]);
        long mod = Long.parseLong(params[1]);
        String[] strArr = br.readLine().trim().split(" ");
        int[] arr = new int[n];
        for(int i = 0; i < n; i++)
            arr[i] = Integer.parseInt(strArr[i]);
        long[] leftMulti = new long[n];
        long[] rightMulti = new long[n];
        leftMulti[0] = 1;
        rightMulti[n - 1] = 1;
        for(int i = 1; i < n; i++) leftMulti[i] = leftMulti[i - 1] * arr[i - 1] % mod;
        for(int i = n - 2; i >= 0; i--) rightMulti[i] = rightMulti[i + 1] * arr[i + 1] % mod;
        for(int i = 0; i < n; i++)
            System.out.print(leftMulti[i] * rightMulti[i] % mod + " ");
    }
}

编辑于 2021-07-01 18:24:54 回复(0)
#include <bits/stdc++.h>
(755)#define ll long long
using namespace std;
int main(){
    int n, p;
    cin>>n>>p;
    int a[n];
    ll l[n+1], r[n+1];
    l[0] = r[n] = 1;
    for(int i=0;i<n;i++){
        cin>>a[i];
        l[i+1] = l[i]*a[i]%p;
    }
    for(int i=n;i>=1;i--)
        r[i-1] = r[i]*a[i-1]%p;
    for(int i=0;i<n;i++)
        cout<<(l[i]*r[i+1]%p)<<" "; 
    return 0;
}

发表于 2020-02-26 00:49:18 回复(0)
#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long n,p;
    cin>>n>>p;
    vector<int>arr(n),l(n+1),r(n+1);
    l[0]=1;
    r[n]=1;
    for(int i=0;i<n;i++)
    {
        cin>>arr[i];
        l[i+1] = l[i]*arr[i]%p;
    }
    for(int i = n-1;i>=0;i--)
        r[i] = r[i+1]*arr[i]%p;
    for(int i=0;i<n;i++)
        cout<<(l[i]*r[i+1]%p)<<" ";
    return 0;
}
不知道为啥下面的方法不对,在IDE都是对的?哪位大神解答一下!
int main()
{     long long n, p;     cin >> n >> p;     vector<int>arr(n);     long long sum = 1;     for (int i = 0; i<n; i++)     {         cin >> arr[i];         sum *= arr[i];     }     for (int i = 0; i<n; i++)         cout << sum / arr[i] % p << "  ";     return 0;
}

发表于 2019-08-28 22:13:17 回复(1)
//构建非乘积数组,不用除法,我看到下面有考虑0的,不用出发就不用考虑0
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        int P = in.nextInt();
        long[] arr = new long[N];
        int firnu = 0;
        while (in.hasNextLong()) {
            arr[firnu++] = in.nextLong();
        }
        Long [] rearr = new Long[N];
        rearr[0] = 1l;
        for (int i = 1; i < N; i++ ) {
            rearr[i] = rearr[i - 1] * arr[i - 1] % P;
        }
        long temp = 1;
        for (int i = N - 2 ; i >= 0; i--) {
            temp = (temp * arr[i + 1]) % P;
            rearr[i] = rearr[i] * temp % P;
        }
        for (int i = 0; i < N; i++) {
            System.out.print(rearr[i] + " ");
        }
    }
}
发表于 2022-04-12 22:29:12 回复(0)
这样为什么不可以呀!!!有没有大佬指点一下
#include <iostream>
#include <vector>

using namespace std;

int main()
{
	int n, p;
	while (cin >> n >> p)
	{
		vector<int> arr(n, 0);
		int all = 1;
		int count = 0;
		int index = 0;
		for (int i = 0; i < n; i++)
		{
			cin >> arr[i];
			if (arr[i] != 0)
			{
				all *= arr[i];
                all%=p;
			}
			else
			{
				count++;
				index = i;
			}
		}
		vector<int> ret(n, 0);
		if (count == 0)
		{
			for (int i = 0; i < n; i++)
			{
				ret[i] = (all / arr[i]) % p;
			}
		}
		else if (count == 1)
		{
			ret[index] = all % p;
		}
		for (int i = 0; i < n; i++)
		{
			cout << ret[i] << " ";
		}
		cout << endl;

	}
	return 0;
}


发表于 2021-09-25 20:16:41 回复(0)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int mod = sc.nextInt();
        long[] arr = new long[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        long[] res = getProducts(arr, mod);
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) {
            sb.append(res[i] + " ");
            
        }
        System.out.println(sb.toString());
    }
    
    //需要用到额外两个:lr与rl,分别代表arr[0...i]从左到右的乘积与
    //arr[i+1...N-1]从右到左的乘积,这样res[i] = lr[i-1] * rl[i+1]
    //通过优化可以只使用一组额外数组
    public static long[] getProducts(long[] arr, int mod) {
        long[] res = new long[arr.length];
        res[0] = arr[0];
        //先得到lr数组
        for (int i = 1; i < arr.length; i++) {
            res[i] = res[i-1] * arr[i] % mod;
        }
        long tmp = 1;
        for (int i = arr.length-1; i > 0; i--) {
            res[i] = tmp * res[i-1] % mod;
            //每一个tmp都记录着rl数组中从右到左的数
            tmp = tmp * arr[i] % mod;
        }
        res[0] = tmp % mod;
        return res;
    }
}

发表于 2021-08-22 15:40:50 回复(0)
N,P = map(int,input().split())
array = list(map(int,input().split()))
l = [0 for _ in range(N+1)]
r = [0 for _ in range(N+1)]
l[0] = 1
r[N] = 1
for i in range(N):
    l[i+1] = l[i] * array[i] % P
for i in range(N-1,-1,-1):
    r[i] = r[i+1] * array[i] % P
answer = []
for i in range(N):
    answer.append(l[i]*r[i+1]%P)
print(' '.join(map(str,answer)))

发表于 2019-09-24 14:26:34 回复(0)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int p = sc.nextInt();
        int[] nums = new int[n];
        long[] res = new long[n];
        long temp = 1;
        for (int i = 0; i < n; i ++) {
            nums[i] = sc.nextInt();
            res[i] = (int)temp;
            temp *= nums[i];
            temp %= p;
        }
        temp = 1;
        for (int i = n - 1; i >= 0; i --) {
            res[i] *= temp;
            res[i] %= p;
            temp *= nums[i];
            temp %= p;
        }
        for (long x: res) {
            System.out.print(x + " ");
        }
    }
}
发表于 2019-08-29 00:11:22 回复(0)
统计0的个数,分没有0,一个0,大于一个0三种情况。
发表于 2019-08-20 21:00:43 回复(0)