1 条题解

  • 1
    @ 2025-1-15 16:34:47
    #include <bits/stdc++.h>
    typedef unsigned long long u64;
    const int P = 1e9 + 7;
    char rb[6000000], *rp = rb, ob[3000000], *op = ob;
    int rd() 
    {
        int x = 0, f = 1;
    
        while (*rp < 48)
            *rp++ == '-' ? f = -1 : 0;
    
        while (*rp > 47)
            x = x * 10 + *rp++ -48;
    
        return x * f;
    }
    
    void pr(int x) 
    {
        int ss[15], sp = 0;
    
        do
            ss[++sp] = x % 10, x /= 10;
        while (x);
    
        while (sp)
            *op++ = ss[sp--] + 48;
    }
    
    int n, p, m;
    int a[507][507], b[507][507];
    u64 c[507];
    
    int fix(int x) 
    {
        return x + (x >> 31 & P);
    }
    
    int main() 
    {
        fread(rb, 1, sizeof(rb), stdin);
        n = rd(), p = rd(), m = rd();
    
        for (int i = 1; i <= n; ++i)
            for (int j = 1; j <= p; ++j)
                a[i][j] = fix(rd());
    
        for (int i = 1; i <= p; ++i)
            for (int j = 1; j <= m; ++j)
                b[i][j] = fix(rd());
    
        int m1 = m - m % 8;
    
        for (int i = 1; i <= n; ++i) 
        {
            for (int j = 1; j <= m; ++j)
                c[j] = 0;
    
            for (int k = 1; k <= p; ++k) 
            {
                int *y = b[k];
                u64 x = a[i][k], *z = c;
    
                for (int j = 8; j <= m1; j += 8) 
                {
                    z[1] += x * y[1];
                    z[2] += x * y[2];
                    z[3] += x * y[3];
                    z[4] += x * y[4];
                    z[5] += x * y[5];
                    z[6] += x * y[6];
                    z[7] += x * y[7];
                    z[8] += x * y[8];
                    z += 8, y += 8;
                }
    
                y = b[k];
    
                for (int j = m1 + 1; j <= m; ++j)
                    c[j] += x * y[j];
    
                if (!(k & 15))
                    for (int j = 1; j <= m; ++j)
                        c[j] -= (c[j] >> 30) * P;
            }
    
            for (int j = 1; j <= m; ++j)
                pr(c[j] % P), *op++ = 32;
    
            *op++ = 10;
        }
    
        fwrite(ob, 1, op - ob, stdout);
        return 0;
    }
    
    • 1

    信息

    ID
    5531
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者