具体思路看注释呀!!!(^▽^)
#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;
}