显示原始代码
#include <bits/stdc++.h>
#include <iostream>
#define int long long
#define endl '\n'
using namespace std;
int read() {
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-')
f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
return x * f;
}
inline int qpow(int a, int n, int p) {
int ans = 1;
while (n) {
if (n & 1)
ans = ans % p * a % p;
a = a % p * a % p;
n >>= 1;
}
return ans;
}
const int MOD = 1e9 + 7;
vector<int> initprefixSum(vector<int> a) {
vector<int> presum(a.size() + 1, 0);
for (int i = 1; i <= a.size(); i++) {
presum[i] = presum[i - 1] + a[i - 1];
}
return presum;
}
int getRange(const vector<int> &a, int l, int r) { return a[r] - a[l - 1]; }
signed main() {
int n = read();
vector<int> a(n);
int s = 1;
for (int i = 0; i < n; i++) {
a[i] = read();
s = (s * (a[i] % MOD)) % MOD;
}
vector<int> b(n);
for (int i = 0; i < n; i++) {
b[i] = qpow(a[i], MOD - 2, MOD);
}
vector<int> prefixSum = initprefixSum(a);
for (int i = 0; i < n; i++) {
int val1 = getRange(prefixSum, 1, i) - getRange(prefixSum, i + 2, n);
int val2 = ((b[i] % MOD) * s) % MOD;
cout << val1 << " " << val2 << endl;
}
return 0;
}