竞赛讨论区 > 毒瘤A题卡内存
头像
__asm
编辑于 2018-09-23 11:43
+ 关注

毒瘤A题卡内存

神防AK题!卒
这一发30
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MOD 1000000007
#define MAXN 210
inlineint***(intx, intp) {
    inty = 1;
    for(; p; p >>= 1) {
        if(p & 1) y = 1LL * y * x % MOD;
        x = 1LL * x * x % MOD;
    }
    returny;
}
inlinevoidup(int&x, inty) {
    if((x += y) >= MOD) x -= MOD;
}
intn, m, a[MAXN][MAXN], s[4][MAXN][MAXN][MAXN], ans[MAXN][MAXN];
inlineboolvalid(intx, inty) {
    returnx >= 1 && x <= n && y >= 1 && y <= m;
}
inlineint$(intx, inty) {
    returnvalid(x, y) ? a[x][y] : 0;
}
intmain() {
    scanf("%d%d", &n, &m);
    for(inti = 1, x; i <= n; i++) {
        for(intj = 1, y; j <= m; j++) {
            scanf("%d%d", &x, &y);
            a[i][j] = 1LL * x * ***(y, MOD - 2) % MOD;
        }
    }
    for(inti = 1; i <= n; i++) {
        for(intj = 1; j <= m; j++) {
            int*p = s[0][i][j];
            p[0] = a[i][j];
            for(intk = 1; k <= n && k <= m; k++) {
                p[k] = 1LL * p[k - 1] * $(i + k, j + k) % MOD;
            }
            p = s[1][i][j];
            p[0] = a[i][j];
            for(intk = 1; k <= n && k <= m; k++) {
                p[k] = 1LL * p[k - 1] * $(i + k, j - k) % MOD;
            }
            p = s[2][i][j];
            p[0] = a[i][j];
            for(intk = 1; k <= n && k <= m; k++) {
                p[k] = 1LL * p[k - 1] * $(i - k, j + k) % MOD;
            }
            p = s[3][i][j];
            p[0] = a[i][j];
            for(intk = 1; k <= n && k <= m; k++) {
                p[k] = 1LL * p[k - 1] * $(i - k, j - k) % MOD;
            }
        }
    }
    for(inti = 1; i <= n; i++) {
        for(intj = 1; j <= m; j++) {
            intp = a[i][j];
            up(ans[i][j], p);
            for(intk = 1; k <= n && k <= m; k++) {
                if(!valid(i - k, j) || !valid(i, j - k) || !valid(i + k, j) || !valid(i, j + k)) break;
                int*q = s[0][i - k][j];
                int*w = s[1][i][j + k];
                int*e = s[3][i + k][j];
                int*r = s[2][i][j - k];
                p = 1LL * p * q[k - 1] % MOD * e[k - 1] % MOD * w[k - 1] % MOD * r[k - 1] % MOD;
                up(ans[i][j], p);
                if(!p) break;
            }
        }
    }
    for(inti = 1; i <= n; i++) {
        for(intj = 1; j <= m; j++) printf("%d ", ans[i][j]);
        puts("");
    }
    return0;
}
这一发100
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MOD 1000000007
inlineint***(intx, intp) {
    inty = 1;
    for(; p; p >>= 1) {
        if(p & 1) y = 1LL * y * x % MOD;
        x = 1LL * x * x % MOD;
    }
    returny;
}
inlinevoidup(int&x, inty) {
    if((x += y) >= MOD) x -= MOD;
}
intn, m, a[201][201], s[4][201][201][101], ans[201][201];
inlineboolvalid(intx, inty) {
    returnx >= 1 && x <= n && y >= 1 && y <= m;
}
inlineint$(intx, inty) {
    returnvalid(x, y) ? a[x][y] : 0;
}
intmain() {
    scanf("%d%d", &n, &m);
    int***er = std::min(n, m) / 2;
    for(inti = 1, x; i <= n; i++) {
        for(intj = 1, y; j <= m; j++) {
            scanf("%d%d", &x, &y);
            a[i][j] = 1LL * x * ***(y, MOD - 2) % MOD;
        }
    }
    for(inti = 1; i <= n; i++) {
        for(intj = 1; j <= m; j++) {
            int*p = s[0][i][j];
            p[0] = a[i][j];
            for(intk = 1; k <= ***er; k++) {
                p[k] = 1LL * p[k - 1] * $(i + k, j + k) % MOD;
            }
            p = s[1][i][j];
            p[0] = a[i][j];
            for(intk = 1; k <= ***er; k++) {
                p[k] = 1LL * p[k - 1] * $(i + k, j - k) % MOD;
            }
            p = s[2][i][j];
            p[0] = a[i][j];
            for(intk = 1; k <= ***er; k++) {
                p[k] = 1LL * p[k - 1] * $(i - k, j + k) % MOD;
            }
            p = s[3][i][j];
            p[0] = a[i][j];
            for(intk = 1; k <= ***er; k++) {
                p[k] = 1LL * p[k - 1] * $(i - k, j - k) % MOD;
            }
        }
    }
    for(inti = 1; i <= n; i++) {
        for(intj = 1; j <= m; j++) {
            intp = a[i][j];
            up(ans[i][j], p);
            for(intk = 1; k <= ***er; k++) {
                if(!valid(i - k, j) || !valid(i, j - k) || !valid(i + k, j) || !valid(i, j + k)) break;
                int*q = s[0][i - k][j];
                int*w = s[1][i][j + k];
                int*e = s[3][i + k][j];
                int*r = s[2][i][j - k];
                p = 1LL * p * q[k - 1] % MOD * e[k - 1] % MOD * w[k - 1] % MOD * r[k - 1] % MOD;
                up(ans[i][j], p);
                if(!p) break;
            }
        }
    }
    for(inti = 1; i <= n; i++) {
        for(intj = 1; j <= m; j++) printf("%d ", ans[i][j]);
        puts("");
    }
    return0;
}

全部评论

(5) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐