Title: Always square A, calculate a + a^2 + a^3 + ... + a^n.
Analysis: Divide and conquer, fast modulus power.
Set f (n) = a + a^2 + a^3 + ... + a^n;
F (n) = f (N/2) + f (N/2) * a^ (N/2) + R; (n is odd exists R, is a^n)
= F (N/2) {E + a^ (N/2)} + R;
The solution can be solved by recursion and divide and conquer.
Note: Read the data directly modulo, otherwise it will overflow ╮(╯▽╰)╭.
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include < Cstdio> #include <cmath>using namespace Std;class matrix{private:int data[41][41];p Ublic:matrix () {}matrix ( int n) {for (int i = 0; i < n; + + i) for (int j = 0; J < N; + + j) {scanf ("%d", &data[i][j]);d Ata[i][j]%= 10;} void Show (int n) {for (int i = 0; i < n; + + i) for (int j = 0; J < N; + + j) {printf ("%d", data[i][j]); if (j = = n-1) pr intf ("\ n"), Else printf ("");} printf ("\ n");} Friend Matrix E (matrix mat, int n); friend Matrix Add (matrix A, matrix B, int n); friend Matrix Mul (matrix A, matrix B, int n); friend Matrix Qpow (Matrix mat, int k); friend Matrix Spow (Matrix mat, int k);};/ /Unit matrices Matrix E (matrix mat, int n) {for (int i = 0; i < n; + + i) for (int j = 0; J < N; + + j) Mat.data[i][j] = (I==J); r Eturn Mat;} Matrix addition matrices Add (Matrix A, Matrix B, int n) {matrix c;for (int i = 0; i < n; + + i) for (int j = 0; J < N; + + j) C.da TA[I][J] = (a.data[i][j]+b.dataI [j]) %10;return C;} Matrices multiplication matrix mul (matrix A, Matrix B, int n) {matrix c;for (int i = 0; i < n; + + i) for (int j = 0; J < N; + + j) { C.DATA[I][J] = 0;for (int k = 0; k < n; + + k) c.data[i][j] = (c.data[i][j]+a.data[i][k]*b.data[k][j])%10;} return C;} Matrix fast-Powers matrix Qpow (Matrix mat, int k, int n) {if (k = = 1) return Mat;matrix now = Qpow (Mat, K/2, n); if (k%2 = = 0) return m UL (now, now, N), return Mul (Mul (now, now, N), Mat, n);} Matrix-Fast power-up and Matrix Spow (matrix mat, int k, int n) {if (k = = 1) return Mat;matrix A = Spow (Mat, K/2, n); Matrix B = Add (Qpow (Mat , K/2, N), E (Mat, N), N), if (k%2 = = 0) return Mul (A, B, N), else return Add (Mul (A, B, N), Qpow (Mat, K, n), n);} int main () {int n,k;while (cin >> n >> k && N) spow (Matrix (n), K, N). Show (n); return 0;}
UVa 11149-power of Matrix