#include <math.h> #include <vector> using namespace std; class ImageFilter{ public: vector <double> filter(int W, int H, int K, vector <double> red, vector <double> green, vector <double> blue, vector <double> A, vector <double> B, double C){ vector<double> ret(red.size()*3); for(int i = 0; i<red.size()/ W; i++){//row for(int j = 0; j<W; j++){//column ret[i*W+j] = C; ret[W*H+i*W+j] = C; ret[2*W*H+i*W+j] = C; for(int di = -K; di<=K; di++){ for(int dj = -K; dj<=K; dj++){ int ii = i + di; int jj = j + dj; int k = (di + K) * (K+K+1) + (dj + K); if(ii >=0 && jj >= 0 && ii < H && jj < W){ ret[i*W+j] += red[ii*W+jj] * B[k]; ret[W*H+i*W+j] += green[ii*W+jj] * B[k]; ret[2*W*H+i*W+j] += blue[ii*W+jj] * B[k]; for(int di2 = -K; di2<=K; di2++){ for(int dj2 = -K; dj2<=K; dj2++){ int l = (di2 + K) * (K+K+1) + (dj2 + K); if(A[k*(K+K+1)*(K+K+1) + l] == 0)continue; int ii2 = i + di2; int jj2 = j + dj2; if(ii2 >=0 && jj2 >= 0 && ii2 < H && jj2 < W){ ret[i*W+j] += red[ii*W+jj] * red[ii2*W+jj2] * A[k*B.size() + l]; ret[W*H+i*W+j] += green[ii*W+jj] * green[ii2*W+jj2]* A[k*B.size() + l]; ret[2*W*H+i*W+j] += blue[ii*W+jj] * blue[ii2*W+jj2]* A[k*B.size() + l]; } } } } } } } } return ret; } }; int main(){ int W, H, K, i; vector<double> red, green, blue, A, B; double C; double d; scanf("%d%d%d",&W,&H,&K); for(i = 0; i<W*H; i++){ scanf("%lf",&d); red.push_back(d); } for(i = 0; i<W*H; i++){ scanf("%lf",&d); green.push_back(d); } for(i = 0; i<W*H; i++){ scanf("%lf",&d); blue.push_back(d); } for(i = 0; i<(K+K+1)*(K+K+1)*(K+K+1)*(K+K+1); i++){ scanf("%lf",&d); A.push_back(d); } for(i = 0; i<(K+K+1)*(K+K+1); i++){ scanf("%lf",&d); B.push_back(d); } scanf("%lf",&C); ImageFilter im; fprintf(stderr,"START\n"); fflush(stderr); vector<double> op = im.filter(W,H,K,red,green,blue,A,B,C); fprintf(stderr,"DONE\n"); fflush(stderr); for(i = 0; i<op.size(); i++){ printf("%lf\n",op[i]); } fflush(stdout); }