- #include<cstdio>
- #define max(a, b) (a < b ? b : a)
- #define LL long long
- using namespace std;
- const int MAXN = 201, mod = 1e9 + 7, INF = 1e9 + 10;
- inline int read() {
- char c = getchar(); int x = 0, f = 1;
- while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
- while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
- return x * f;
- }
- int N, M, a[MAXN][MAXN], g[MAXN][MAXN][MAXN], vis[MAXN][MAXN];
- LL fastpow(LL a, LL p) {
- LL base = 1;
- while(p) {
- if(p & 1) base = 1ll * base * a % mod;
- a = 1ll * a * a % mod; p >>= 1;
- }
- return base;
- }
- LL inv(LL a) {
- return fastpow(a, mod - 2);
- }
- int mul(int a, int b) {
- if(1ll * a * b > mod) return 1ll * a * b % mod;
- else return a * b;
- }
- void Pre() {
- //cout << a[1][1] << endl;
- for(int i = 1; i <= N; i++)
- for(int j = 1; j <= M; j++)
- g[0][i][j] = a[i][j] % mod;
-
- for(int k = 1; k <= max(N, M); k++)
- for(int i = 1; i <= N; i++)
- for(int j = 1; j <= M; j++) {
- if((i - k < 0) || (j - k < 0) || (i + k > N + 1) || (j + k > M + 1)) {vis[i][j] = 1; continue;}
- if(vis[i][j]) continue;
- g[k][i][j] = mul(g[k - 1][i - 1][j], g[k - 1][i + 1][j]);
- if(k > 2) g[k][i][j] = mul(g[k][i][j], inv(g[k - 2][i][j]));
- if(k >= 2) g[k][i][j] = mul(mul(g[k][i][j], inv(a[i][j + k - 2])), inv(a[i][j - k + 2]));
- g[k][i][j] = mul(mul(g[k][i][j], a[i][j + k]), a[i][j - k]);
- }
- }
- LL calc(int x, int y) {
- LL ans = 0, s = a[x][y];
- for(int i = 1; i <= max(N, M); i++) {
- if((x - i < 0) || (y - i < 0) || (x + i > N + 1) || (y + i > M + 1)) break;
- int now = g[i][x][y];
- ans = (ans + mul(mul(i, (1 - now + mod)), s)) % mod;
- s = mul(s, now);
- }
- return ans;
- }
- int main() {
- // freopen("a.in", "r", stdin);
- N = read(); M = read();
- for(LL i = 1; i <= N; i++) {
- for(LL j = 1; j <= M; j++) {
- LL x = read(), y = read();
- a[i][j] = mul(x, inv(y));
- }
- }
- Pre();
- for(LL i = 1; i <= N; i++, puts(""))
- for(LL j = 1; j <= M; j++)
- printf("%lld ", calc(i, j) % mod);
- return 0;
- }