1 0 1 2 0 1 2 3 4 5 6 7
0 0 1 2 1
題意 :矩陣相乘
思路:復雜度O(n^3)是接受不了的,但是出於題目的意思%3,所以我們可以不去處理0的情況,我們把原本最裡面的那層for(k ) 拿到最外面,然後當有一行的某列出現0 的時候,那麼對應的所有列對應的行也就不加入計算了,再加上出入外掛水過
#include#include #include #include typedef long long ll; using namespace std; const int maxn = 805; int a[maxn][maxn], b[maxn][maxn], c[maxn][maxn]; int n; int Scan() { int res = 0, ch, flag = 0; if ((ch = getchar()) == '-') flag = 1; else if (ch >= '0' && ch <= '9') res = ch - '0'; while ((ch = getchar()) >= '0' && ch <= '9') res = res * 10 + ch - '0'; return flag?-res:res; } int main() { while (scanf("%d", &n) != EOF) { for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) { a[i][j] = Scan() % 3; c[i][j] = 0; } for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) b[i][j] = Scan() % 3; for (int k = 1; k <= n; k++) for (int i = 1; i <= n; i++) if (a[i][k]) for (int j = 1; j <= n; j++) c[i][j] += a[i][k] * b[k][j]; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) printf("%d%c", c[i][j]%3, (j==n)?'\n':' '); } return 0; }