UVA11149 Power of Matrix —— 矩阵倍增、矩阵快速幂
2024-08-29 14:41:29
题目链接: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");
}
}
最新文章
- 详细介绍Mysql各种存储引擎的特性以及如何选择存储引擎
- canvas变幻曲线
- hibernate笔记--双向一对多映射方法
- Hibernate中evict方法和clear方法说明
- shell编程入门
- URAL 1117. Hierarchy(DP)
- WordPress Backdoor未授权访问漏洞和信息泄露漏洞
- (转载)MySQL BETWEEN 用法
- UESTC_王之盛宴 2015 UESTC Training for Graph Theory<;Problem K>;
- uva 11396Claw Decomposotion(二分图判定)
- 让shell 变得容易理解
- thinkpad E480 用户初体验
- 学习tornado:模板
- Ubuntu 16.04下安装搜狗输入法
- 编码符_new88
- C# Note15:设置Window图标的正确方式
- charles系列破解激活办法(最高charles4.2都可以激活)
- storage 事件监听
- editplus设置自动换行方法 editplus自动换行设置步骤
- Tomcat数据源配置方法总结