zoukankan      html  css  js  c++  java
  • UVA 11149

    UVA 11149 - Power of Matrix

    题目链接

    题意:给定一个n*n的矩阵A和k,求kiAi

    思路:利用倍增去搞。kiAi=(1+Ak/2)k/2iAi,不断二分就可以

    代码:

    #include <cstdio>
    #include <cstring>
    
    const int N = 45;
    
    int n, k;
    
    struct mat {
    	int v[N][N];
    	mat() {memset(v, 0, sizeof(v));}
     	mat operator * (mat c) {
    	 	mat ans;
    	 	for (int i = 0; i < n; i++) {
    	 		for (int j = 0; j < n; j++) {
    	 			for (int k = 0; k < n; k++) {
    	 				ans.v[i][j] = (ans.v[i][j] + v[i][k] * c.v[k][j]) % 10;
         			}
        		}
    		}
    		return ans;
      	}
      	mat operator + (mat c) {
      		mat ans;
      		for (int i = 0; i < n; i++)
      			for (int j = 0; j < n; j++)
      				ans.v[i][j] = (v[i][j] + c.v[i][j]) % 10;
    		return ans;
       	}
    } A;
    
    mat pow_mod(mat x, int k) {
    	mat ans;
    	for (int i = 0; i < n; i++) ans.v[i][i] = 1;
    	while (k) {
    		if (k&1) ans = ans * x;
    		x = x * x;
    		k >>= 1;
     	}
     	return ans;
    }
    
    mat solve(mat x, int k) {
    	if (k == 1) return x;
    	mat ans;
    	for (int i = 0; i < n; i++) ans.v[i][i] = 1;
    	if (k == 0) return ans;
    	ans = (ans + pow_mod(x, k>>1))* solve(x, k>>1);
    	if (k&1) ans = ans + pow_mod(x, k);
    	return ans;
    }
    
    int main() {
    	while (~scanf("%d%d", &n, &k) && n) {
     		for (int i = 0; i < n; i++)
       			for (int j = 0; j < n; j++) {
          			scanf("%d", &A.v[i][j]);
          			A.v[i][j] %= 10;
       			}
      	    A = solve(A, k);
      	    for (int i = 0; i < n; i++)
      	    	for (int j = 0; j < n; j++)
      	    		printf("%d%c", A.v[i][j], (j == n - 1 ? '
    ' : ' '));
    		printf("
    ");
     	}
    	return 0;
    }


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    一转眼,十年间~~~
    怎样安装PHPnow,并开始使用?
    js的事件类型
    ie兼容性问题 前传
    外层div撑不开的解决办法
    CSS3 新属性搜罗整理
    webApp学习之路
    花式使用CSS3 transition
    20种新颖的按钮风格和效果【附源码】
    酷酷的文本效果
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4818897.html
Copyright © 2011-2022 走看看