1. 程式人生 > >Newcoder 110 D.矩陣(水~)

Newcoder 110 D.矩陣(水~)

Description

給定兩個巨大的方塊矩陣 A A B B (行數高達 7000

7000 ).請輸出 A × B A\times B 的運算結果,且時限只有 2 s
2s

哈哈!對矩陣乘法的演進歷史有些涉獵的人,應該能感受到在某 C P C CPC 上出現這樣的題目有多不合理。

為了使這個問題成為可能(?),我們將減小 I

/ O I / O 大小。

現在,給定 a b c d a,b,c,d 的四個種子可以通過 X o r s h i f t Xorshift 隨機數生成器生成輸入矩陣。

這裡是通過隨機數生成器來產生矩陣的實現:

uint32_t x, y, z, w;
uint32_t xorshift() {
    uint32_t t = x;
    t ^= t << 11;
    t ^= t >> 8;
    x = y; y = z; z = w;
    w ^= w >> 19;
    w ^= t;
    return w & ((1 << 24) - 1);
}
void getInputMatrix(
    int n, uint32_t matrix[][7000],
    uint32_t a, uint32_t b, uint32_t c, uint32_t d
) {
    x = a; y = b; z = c; w = d;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            matrix[i][j] = xorshift();
        }
    }
}

另外,您應該將輸出矩陣傳遞給雜湊函式 ( h a s h f u n c t i o n ) (hash function)

我們會給你另一個數字 p p 來做這件事。

這裡是雜湊函式的實現。

const int MOD = 1000000007;
int hash(int n, long long matrix[][7000], int p) {
    long long v = 0;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            v *= p;
            v += matrix[i][j];
            v %= MOD;
        }
    }
    return v;
}

Input

輸入只包含一行,包含十個整數 n , A a , A b , A c , A d , B a , B b , B c , B d , p n,A_a,A_b,A_c,A_d,B_a,B_b,B_c,B_d,p

矩陣 A A 是通過 n , A a , A b , A c , A d n,A_a,A_b,A_c,A_d 構建 g e t I n p u t M a t r i x ( ) getInputMatrix() 的。

矩陣 B B 是通過 n , B a , B b , B c , B d n,B_a,B_b,B_c,B_d 構建 g e t I n p u t M a t r i x ( ) getInputMatrix() 的。

p p 是雜湊函式。

( 1 n 2000 , 1 A a , A b , A c , A d , B a , B b , B c , B d &lt; 2 32 , 2 p &lt; 1 0 9 + 7 ) (1\le n\le 2000,1\le A_a,A_b,A_c,A_d,B_a,B_b,B_c,B_d&lt; 2^{32},2\le p&lt;10^9+7)

Output

C = A × B C = A \times B C C A A 矩陣乘以 B B 的結果

請輸出一個整數,它是$hash(n,C,p) $的結果

Sample Input

1 2 3 4 5 6 7 8 9 10

Sample Output

50873769

Solution
a n s = i = 0 n 1 j = 0 n 1 C i j p ( n 1 i ) n + ( n 1 j ) = i = 0 n 1 j = 0 n 1 k = 0 n 1 A i k B k j p ( n 1 i ) n + ( n 1 j ) = k = 0 n 1 ( i = 0 n 1 A i k p ( n 1 i ) n ) ( j = 0 n 1 B k j p n 1 j ) \begin{array}{lcl} ans&amp;=&amp;\sum\limits_{i=0}^{n-1}\sum\limits_{j=0}^{n-1}C_{ij}\cdot p^{(n-1-i)\cdot n+(n-1-j)}\\ &amp;=&amp;\sum\limits_{i=0}^{n-1}\sum\limits_{j=0}^{n-1}\sum\limits_{k=0}^{n-1}A_{ik}\cdot B_{kj}\cdot p^{(n-1-i)\cdot n+(n-1-j)}\\ &amp;=&amp;\sum\limits_{k=0}^{n-1}(\sum\limits_{i=0}^{n-1}A_{ik}\cdot p^{(n-1-i)\cdot n})\cdot (\sum\limits_{j=0}^{n-1}B_{kj}\cdot p^{n-1-j}) \end{array}