题目链接:https://vjudge.net/problem/UVA-11149

题意:

给出矩阵A,求出A^1 + A^2 …… + A^k 。

题解:

1.可知:A^1 + A^2 …… + A^k = (1+A^k/2)*(A^1 + A^2 …… + A^k/2)+ (k%2?A^k:0)。

2.根据上述式子,可二分对其求解。

代码如下:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <set>
using namespace std;
typedef long long LL;
const int INF = 2e9;
const LL LNF = 9e18;
//const int MOD = 1e9+7;
const int MAXN = 1e6+; const int MOD = ;
int Size;
struct MA
{
LL mat[][];
void init()
{
for(int i = ; i<Size; i++)
for(int j = ; j<Size; j++)
mat[i][j] = (i==j);
}
}; MA mul(MA x, MA y)
{
MA ret;
memset(ret.mat, , sizeof(ret.mat));
for(int i = ; i<Size; i++)
for(int j = ; j<Size; j++)
for(int k = ; k<Size; k++)
ret.mat[i][j] += 1LL*x.mat[i][k]*y.mat[k][j]%MOD, ret.mat[i][j] %= MOD;;
return ret;
} MA add(MA x, MA y)
{
MA ret;
memset(ret.mat, , sizeof(ret.mat));
for(int i = ; i<Size; i++)
for(int j = ; j<Size; j++)
ret.mat[i][j] = x.mat[i][j]+y.mat[i][j], ret.mat[i][j] %= MOD;
return ret;
} MA qpow(MA x, LL y)
{
MA s;
s.init();
while(y)
{
if(y&) s = mul(s, x);
x = mul(x, x);
y >>= ;
}
return s;
} MA solve(MA x, int k)
{
if(k==) return x;
MA s;
s.init();
s = mul(add(s, qpow(x, k/)), solve(x, k/));
if(k%) s = add(s, qpow(x, k));
return s;
} int main()
{
int n, k;
while(scanf("%d%d", &n,&k)&&n)
{
MA s;
Size = n;
memset(s.mat, , sizeof(s.mat));
for(int i = ; i<n; i++)
for(int j = ; j<n; j++)
{
scanf("%lld", &s.mat[i][j]);
s.mat[i][j] %= MOD;
} s = solve(s, k);
for(int i = ; i<n; i++)
{
for(int j = ; j<n; j++)
printf("%lld%s", s.mat[i][j], j==n-?"\n":" ");
}
printf("\n");
}
}

最新文章

  1. 详细介绍Mysql各种存储引擎的特性以及如何选择存储引擎
  2. canvas变幻曲线
  3. hibernate笔记--双向一对多映射方法
  4. Hibernate中evict方法和clear方法说明
  5. shell编程入门
  6. URAL 1117. Hierarchy(DP)
  7. WordPress Backdoor未授权访问漏洞和信息泄露漏洞
  8. (转载)MySQL BETWEEN 用法
  9. UESTC_王之盛宴 2015 UESTC Training for Graph Theory&lt;Problem K&gt;
  10. uva 11396Claw Decomposotion(二分图判定)
  11. 让shell 变得容易理解
  12. thinkpad E480 用户初体验
  13. 学习tornado:模板
  14. Ubuntu 16.04下安装搜狗输入法
  15. 编码符_new88
  16. C# Note15:设置Window图标的正确方式
  17. charles系列破解激活办法(最高charles4.2都可以激活)
  18. storage 事件监听
  19. editplus设置自动换行方法 editplus自动换行设置步骤
  20. Tomcat数据源配置方法总结

热门文章

  1. awk 统计
  2. 某考试 T1 Hello my friend
  3. CODECHEF Oct. Challenge 2014 Children Trips
  4. Engine中如何截取线上指定两点间的线段?
  5. 【js】小数点后保留两位小数
  6. 转: 浅析Fusion-IO和Intel SSD
  7. hadoop安全之hftp
  8. h5调用手机照相机
  9. CUDA编程-&amp;gt;CUDA入门了解(一)
  10. 小数运算需要注意什么? 接口和抽象类 WinForm窗体上两个panel,怎么实现一个panel固定漂浮在另一个panel之上