rt,悬关
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 20001;
int n, a[MAXN], b[MAXN], c[MAXN], d[MAXN], x[MAXN];
char op;
void read(int a[]) {
string s;
cin >> s;
fill(a + 1, a + MAXN + 1, 0);
for(int i = 0; i < s.size(); i++) {
a[i] = s[i] - '0';
}
reverse(a, a + s.size());
}
void print(int a[]) {
int i;
for(i = MAXN; i >= 1; i--) {
if(a[i] != 0) {
break;
}
}
for(; i >= 0; i--) {
cout << a[i] << " ";
}
}
void add(int a[], int b[], int c[]) {
fill(c + 1, c + MAXN + 1, 0);
for(int i = 0; i < n; i++) {
c[i] += a[i] + b[i];
if(c[i] >= x[i]) {
c[i + 1] += c[i] / x[i];
c[i] %= x[i];
}
}
}
void sub(int a[], int b[], int c[]) {
fill(c + 1, c + MAXN + 1, 0);
for(int i = 0; i < n; i++) {
c[i] += a[i] - b[i];
if(c[i] < 0) {
c[i + 1] -= abs(c[i]) / x[i] + !!(abs(c[i]) % x[i]);
c[i] += (abs(c[i]) / x[i] + !!(abs(c[i]) % x[i])) * x[i];
}
}
}
bool check(int a[], int b[], int low, int len) {
if(a[len + low] != 0) {
return true;
}
for(int i = len - 1; i >= 0; i--) {
if(a[i + low] > b[i]) {
return true;
}
else if(a[i + low] < b[i]) {
return false;
}
}
return true;
}
void div(int a[], int b[], int c[], int d[]) {
fill(c + 1, c + MAXN + 1, 0);
fill(d + 1, d + MAXN + 1, 0);
int lena = MAXN - 1, lenb = MAXN - 1;
for(; lena > 0; lena--) {
if(a[lena - 1] != 0) {
break;
}
}
for(; lenb > 0; lenb--) {
if(b[lenb - 1] != 0) {
break;
}
}
for(int i = 0; i < lena; i++) {
d[i] = a[i];
}
for(int i = lena - lenb; i >= 0; i--) {
while(check(d, b, i, lenb)) {
for(int j = 0; j < lenb; j++) {
d[i + j] -= b[j];
if(d[i + j] < 0) {
d[i + j] += 10;
d[i + j + 1]--;
}
}
c[i]++;
}
}
}
int main() {
cin >> n;
for(int i = 0; i < n; i++) {
cin >> x[i];
}
for(int i = 0; i < n; i++) {
cin >> a[i];
}
cin >> op;
for(int i = 0; i < n; i++) {
cin >> b[i];
}
reverse(x, x + n);
reverse(a, a + n);
reverse(b, b + n);
if(op == '+') {
add(a, b, c);
print(c);
}
else {
sub(a, b, c);
print(c);
}
return 0;
}