#include <iostream>
#include <math.h>
using namespace std;
#define PI 4*atan(1)
void f2c(double * f, int N, int M, double hx, double hy) {
double * c = (double*) malloc(sizeof(double) * (N) * (M));
double * t = (double*) malloc(sizeof(double) * (N));
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
double tmp = 0.0;
for (int k = 0; k < M; k++) {
tmp += sqrt(2)*f[k*(N) + j] * sin(PI * (i + 0.5) * (k + 1) * hy) * hy;
}
t[j] = tmp;
}
for (int j = 0; j < N; j++) {
double tmp = 0.0;
for (int k = 0; k < N - 1; k++) {
tmp += sqrt(2)*sin(PI * (k + 1) * (j + 1) * hx) * t[k] * hx;
}
c[j * (N) + i] = tmp;
//cout << t << " ";
}
}
double max_er = 0.0;
for (int i = 0; i < M; i++) {
for (int j = 0; j < N ; j++) {
double tmp = 0.0;
for (int k = 0; k < M ;k++) {
for (int m = 0; m < N; m++) {
if (i == M - 1) {
tmp += 2*sin(PI * (i + 1) * (k + 0.5) * hy) * sin(PI * (j + 1) * (m + 1) * hx) * c[m*(M) + k];
cout << tmp << " ";
}
}
}
if (i == M - 1) {
cout << endl;
}
cout << tmp << " ";
/*if (j == N - 2) {
if (max_er < fabs(f[i*(M - 1) + j] - tmp / 2)) {
max_er = fabs(f[i*(M - 1) + j] - tmp / 2);
}
} else {
if (max_er < fabs(f[i*(M - 1) + j] - tmp)) {
max_er = fabs(f[i*(M - 1) + j] - tmp);
}
}*/
}
cout << endl;
}
}
double scal(double * x, double * y, int N, double h) {
double t = 0.0;
for (int i = 0;i < N - 1; i++) {
t+= x[i] * y[i] * h;
}
return t;
}
int main() {
int N, M;
cin >> N >> M;
double hx = 1.0 / (N);
double hy = 1.0 / (M);
double * f = (double *) malloc(sizeof(double) * (N) * (M));
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
double x = (j + 1) * hx;
double y = (i + 0.5) * hy;
f[i*(N) + j] = sin(PI * x) * sin(PI * y);
cout << f[i*(N) + j] << " ";
}
cout << endl;
}
cout << endl;
f2c(f,N,M,hx,hy);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWF0aC5oPgogCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKI2RlZmluZSBQSSA0KmF0YW4oMSkKIAp2b2lkIGYyYyhkb3VibGUgKiBmLCBpbnQgTiwgaW50IE0sIGRvdWJsZSBoeCwgZG91YmxlIGh5KSB7Cglkb3VibGUgKiBjID0gKGRvdWJsZSopIG1hbGxvYyhzaXplb2YoZG91YmxlKSAqIChOKSAqIChNKSk7Cglkb3VibGUgKiB0ID0gKGRvdWJsZSopIG1hbGxvYyhzaXplb2YoZG91YmxlKSAqIChOKSk7Cglmb3IgKGludCBpID0gMDsgaSA8IE07ICBpKyspIHsKCQlmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgewoJCQlkb3VibGUgdG1wID0gMC4wOwoJCQlmb3IgKGludCBrID0gMDsgayA8IE07IGsrKykgewoJCQkJdG1wICs9IHNxcnQoMikqZltrKihOKSArIGpdICogc2luKFBJICogKGkgKyAwLjUpICogKGsgKyAxKSAqIGh5KSAqIGh5OwoJCQl9CgkJCXRbal0gPSB0bXA7CgkJfQkKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgewogICAgICAgICAgICBkb3VibGUgdG1wID0gMC4wOwogICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IE4gLSAxOyBrKyspIHsKICAgICAgICAgICAgICAgIHRtcCArPSBzcXJ0KDIpKnNpbihQSSAqIChrICsgMSkgKiAoaiArIDEpICogaHgpICogdFtrXSAqIGh4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNbaiAqIChOKSArIGldID0gdG1wOwogICAgICAgICAgICAvL2NvdXQgPDwgdCA8PCAiICI7CiAgICAgICAgfQoJfQoJZG91YmxlIG1heF9lciA9IDAuMDsKCWZvciAoaW50IGkgPSAwOyBpIDwgTTsgaSsrKSB7CgkJZm9yIChpbnQgaiA9IDA7IGogPCBOIDsgaisrKSB7CgkJCWRvdWJsZSB0bXAgPSAwLjA7CgkJCWZvciAoaW50IGsgPSAwOyBrIDwgTSA7aysrKSB7CgkJCQlmb3IgKGludCBtID0gMDsgbSA8IE47IG0rKykgewoJCQkJCWlmIChpID09IE0gLSAxKSB7CgkJCQkJCXRtcCArPSAyKnNpbihQSSAqIChpICsgMSkgKiAoayArIDAuNSkgKiBoeSkgKiBzaW4oUEkgKiAoaiArIDEpICogKG0gKyAxKSAqIGh4KSAqIGNbbSooTSkgKyBrXTsKCQkJCQkJY291dCA8PCB0bXAgPDwgIiAiOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlpZiAoaSA9PSBNIC0gMSkgewoJCQkJY291dCA8PCBlbmRsOwoJCQl9CgkJCWNvdXQgPDwgdG1wIDw8ICIgIjsKCQkJLyppZiAoaiA9PSBOIC0gMikgewoJCQkJaWYgKG1heF9lciA8IGZhYnMoZltpKihNIC0gMSkgKyBqXSAtIHRtcCAvIDIpKSB7CgkJCQkJbWF4X2VyID0gZmFicyhmW2kqKE0gLSAxKSArIGpdIC0gdG1wIC8gMik7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlpZiAobWF4X2VyIDwgZmFicyhmW2kqKE0gLSAxKSArIGpdIC0gdG1wKSkgewoJCQkJCW1heF9lciA9IGZhYnMoZltpKihNIC0gMSkgKyBqXSAtIHRtcCk7CgkJCQl9CgkJCX0qLwoJCX0KCQljb3V0IDw8IGVuZGw7Cgl9Cn0KIApkb3VibGUgc2NhbChkb3VibGUgKiB4LCBkb3VibGUgKiB5LCBpbnQgTiwgZG91YmxlIGgpIHsKCWRvdWJsZSB0ID0gMC4wOwoJZm9yIChpbnQgaSA9IDA7aSA8IE4gLSAxOyBpKyspIHsKCQl0Kz0geFtpXSAqIHlbaV0gKiBoOwoJfQoJcmV0dXJuIHQ7Cn0KIAppbnQgbWFpbigpIHsKCWludCBOLCBNOwoJY2luID4+IE4gPj4gTTsKCWRvdWJsZSBoeCA9IDEuMCAvIChOKTsKCWRvdWJsZSBoeSA9IDEuMCAvIChNKTsKCWRvdWJsZSAqIGYgPSAoZG91YmxlICopIG1hbGxvYyhzaXplb2YoZG91YmxlKSAqIChOKSAqIChNKSk7Cglmb3IgKGludCBpID0gMDsgaSA8IE07IGkrKykgewoJCWZvciAoaW50IGogPSAwOyBqIDwgTjsgaisrKSB7CgkJCWRvdWJsZSB4ID0gKGogKyAxKSAqIGh4OwoJCQlkb3VibGUgeSA9IChpICsgMC41KSAqIGh5OwoJCQlmW2kqKE4pICsgal0gPSBzaW4oUEkgKiB4KSAqIHNpbihQSSAqIHkpOwoJCQljb3V0ICA8PCBmW2kqKE4pICsgal0gPDwgIiAiOwoJCX0KCQljb3V0IDw8IGVuZGw7Cgl9Cgljb3V0IDw8IGVuZGw7CglmMmMoZixOLE0saHgsaHkpOwoJcmV0dXJuIDA7Cn0=