poj 1575  Tr A

主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1575

题目大意:A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。

数据的第一行是一个T,表示有T组数据。

每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每一个数据的范围是[0,9]。表示方阵A的内容。

一个矩阵高速幂的裸题。

题解:

#include<iostream>
#include<stdio.h>
#include<cstring>
#define Mod 9973
using namespace std;
const int MAX = 11; struct Matrix
{
int v[MAX][MAX];
}; int n, k, M; Matrix mtMul(Matrix A, Matrix B) // 求矩阵 A * B
{
int i, j, k;
Matrix C;
for(i = 0; i < n; i ++)
for(j = 0; j < n; j ++)
{
C.v[i][j] = 0;
for(k = 0; k < n; k ++)
C.v[i][j] = (A.v[i][k] * B.v[k][j] + C.v[i][j]) % Mod;
}
return C;
} Matrix mtPow(Matrix A, int k) // 求矩阵 A ^ k
{
if(k == 0)
{
memset(A.v, 0, sizeof(A.v));
for(int i = 0; i < n; i ++)
A.v[i][i] = 1;
return A;
} if(k == 1) return A; Matrix C = mtPow(A, k / 2);
if(k % 2 == 0)
return mtMul(C, C);
else
return mtMul(mtMul(C, C), A);
} int solv (Matrix A)
{
int ans=0;
for(int i=0;i<n;i++)
ans+=A.v[i][i]%Mod;
return ans;
} void out(Matrix A)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
printf("%d ",A.v[i][j]);
cout<<endl;
}
} int main ()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
Matrix A;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&A.v[i][j]);
Matrix ans;
ans=mtPow(A,k);
//out(ans);
cout<<solv(ans)%Mod<<endl;
}
}

poj 3233 Matrix Power Series

相同的矩阵高速幂裸题,主要是要用到
S(6) = (1 + A^3) * S(3)以及S(7) = A + (A + A^4) * S(3),这两个最后求的时候递归会省非常多时间
#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
const int MAX = 32; struct Matrix
{
int v[MAX][MAX];
}; int n, k, M; Matrix mtAdd(Matrix A, Matrix B) // 求矩阵 A + B
{
int i, j;
Matrix C;
for(i = 0; i < n; i ++)
for(j = 0; j < n; j ++)
C.v[i][j]=(A.v[i][j]+B.v[i][j])% M;
return C;
} Matrix mtMul(Matrix A, Matrix B) // 求矩阵 A * B
{
int i, j, k;
Matrix C;
for(i = 0; i < n; i ++)
for(j = 0; j < n; j ++)
{
C.v[i][j] = 0;
for(k = 0; k < n; k ++)
C.v[i][j] = (A.v[i][k] * B.v[k][j] + C.v[i][j]) % M;
}
return C;
} Matrix mtPow(Matrix A, int k) // 求矩阵 A ^ k
{
if(k == 0)
{
memset(A.v, 0, sizeof(A.v));
for(int i = 0; i < n; i ++)
A.v[i][i] = 1;
return A;
} if(k == 1) return A; Matrix C = mtPow(A, k / 2);
if(k % 2 == 0)
return mtMul(C, C);
else
return mtMul(mtMul(C, C), A);
} Matrix mtCal(Matrix A, int k) // 求S (k) = A + A2 + A3 + … + Ak
{
if(k == 1) return A;
Matrix B = mtPow(A, (k+1) / 2);
Matrix C = mtCal(A, k / 2);
if(k % 2 == 0)
return mtMul(mtAdd(mtPow(A, 0), B), C); // 如S(6) = (1 + A^3) * S(3)。 else
return mtAdd(A, mtMul(mtAdd(A, B), C)); // 如S(7) = A + (A + A^4) * S(3)
} void out(Matrix A)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n-1;j++)
cout<<A.v[i][j]<<" ";
cout<<A.v[i][n-1]<<endl;
}
} int main ()
{
Matrix A;
scanf("%d%d%d",&n,&k,&M);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&A.v[i][j]);
Matrix C=mtCal(A,k);
out(C); }


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

矩阵十点【两】 poj 1575 Tr A poj 3233 Matrix Power Series的更多相关文章

  1. POJ 3233 Matrix Power Series 【经典矩阵快速幂+二分】

    任意门:http://poj.org/problem?id=3233 Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K To ...

  2. POJ 3233 Matrix Power Series (矩阵乘法)

    Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 11954   Accepted:  ...

  3. [ACM] POJ 3233 Matrix Power Series (求矩阵A+A^2+A^3...+A^k,二分求和或者矩阵转化)

    Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 15417   Accepted:  ...

  4. Poj 3233 Matrix Power Series(矩阵乘法)

    Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Description Given a n × n matrix A and ...

  5. POJ 3233 Matrix Power Series(矩阵快速幂)

    Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 19338 Accepted: 8161 ...

  6. poj 3233 Matrix Power Series(矩阵二分,高速幂)

    Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 15739   Accepted:  ...

  7. Poj 3233 Matrix Power Series(矩阵二分快速幂)

    题目链接:http://poj.org/problem?id=3233 解题报告:输入一个边长为n的矩阵A,然后输入一个k,要你求A + A^2 + A^3 + A^4 + A^5.......A^k ...

  8. POJ 3233 Matrix Power Series(矩阵高速功率+二分法)

    职务地址:POJ 3233 题目大意:给定矩阵A,求A + A^2 + A^3 + - + A^k的结果(两个矩阵相加就是相应位置分别相加).输出的数据mod m. k<=10^9.     这 ...

  9. POJ 3233 Matrix Power Series (矩阵+二分+二分)

    题目地址:http://poj.org/problem?id=3233 题意:给你一个矩阵A,让你求A+A^2+……+A^k模p的矩阵值 题解:我们知道求A^n我们可以用二分-矩阵快速幂来求,而 当k ...

随机推荐

  1. android请求

    //请求 HttpURLConnection conn = (HttpURLConnection)new URL(path).openConnection(); conn.setConnecTimeo ...

  2. 不可摸数 【杭电-HDOJ-1999】 附题

    /* hdu 1999 不可摸数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. redis学习笔记之虚拟内存

    首先说明下redis的虚拟内存与os的虚拟内存不是一码事,但是思路和目的都是相同的.就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的 内存空间用于其他需要访问的数据.尤其是对于redis这 ...

  4. 读取Webpage表中的内容 分类: H3_NUTCH 2015-02-10 14:59 418人阅读 评论(0) 收藏

    nutch将从网页中抓取到的信息放入hbase数据库中,默认情况下表名为$crawlId_webpage,但表中的内容以16进制进行表示,直接scan或者通过Java API进行读取均只能读取到16进 ...

  5. angular模块详解

    原文: https://www.jianshu.com/p/819421ff955a 大纲 1.angular应用是模块化的 2.对模块(Module)的认识 3.模块的分类:根模块和特性模块 4.N ...

  6. POJ 1775 Sum of Factorials (ZOJ 2358)

    http://poj.org/problem?id=1775 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1334 题目大意: ...

  7. js进阶正则表达式修饰符(i、g、m)(var reg2=/html/gi)

    js进阶正则表达式修饰符(i.g.m)(var reg2=/html/gi) 一.总结 1.正则表达式使用:通过那些支持正则表达式的字符串函数来使用(search.match.replace.spli ...

  8. Mysql 安装(Using Generic Binaries)

    本次 Mysql 为Community 5.6.21 版本号.安装方式为通用Linux安装方式.即大多数Linux平台都能够採用该方式进行安装. 一.安装步骤 1.安装环境 1)Centos 7.0. ...

  9. Git之同一台电脑如何连接多个远程仓库

    Git之同一台电脑如何连接多个远程仓库 一.总结 一句话总结: 1.git使用.git目录里面的内容(ssh或用户名密码)来自动和远程仓库通信 2.在不同的仓库中配置不同的.git目录,可以连接不同的 ...

  10. 找不到头文件xxxxx.h file not found

    项目里有该文件,但是还是显示找不到.或者是cocopods打开的项目. 原因:.h文件路径找不到.具体找不到的原因有很多种. 1.一般会设置 IOS引用三方framewrok的头文件出现'xxxxx/ ...