http://poj.org/problem?id=3233 (题目链接)

题意

  给出一个n×n的矩阵A,求模m下A+A2+A3+…+Ak 的值

Solution

  今日考试就A了这一道题。。

  当k为偶数时,原式=(Ak2+1)×(A1+A2+...+Ak2)。

  当k为奇数的时候将Ak乘上当前答案后抠出去,最后统计答案时再加上。所以我们就一路快速幂搞过去,AC

代码

// poj3233
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=31;
int A[maxn][maxn],B[maxn][maxn],C[maxn][maxn],T[maxn][maxn],tmp[maxn][maxn],ans[maxn][maxn],D[maxn][maxn];
int n,m; void pow(int k) {
for (int i=1;i<=n;i++) {
for (int j=1;j<=n;j++) B[i][j]=0,T[i][j]=A[i][j];
B[i][i]=1;
}
while (k) {
if (k&1) {
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) {
tmp[i][j]=0;
for (int k=1;k<=n;k++) tmp[i][j]=(tmp[i][j]+B[i][k]*T[k][j])%m;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) B[i][j]=tmp[i][j];
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) {
C[i][j]=0;
for (int k=1;k<=n;k++) C[i][j]=(C[i][j]+T[i][k]*T[k][j])%m;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) swap(C[i][j],T[i][j]);
k>>=1;
}
}
void update() {
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) {
tmp[i][j]=0;
for (int k=1;k<=n;k++) tmp[i][j]=(tmp[i][j]+ans[i][k]*B[k][j])%m;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) ans[i][j]=tmp[i][j];
}
int main() {
int k;
scanf("%d%d%d",&n,&k,&m);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) scanf("%d",&A[i][j]);
memset(ans,0,sizeof(ans));for (int i=1;i<=n;i++) ans[i][i]=1;
while (k>1) {
if (k&1) {
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) T[i][j]=A[i][j];
pow(k);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) {
tmp[i][j]=0;
for (int k=1;k<=n;k++) tmp[i][j]=(tmp[i][j]+B[i][k]*ans[k][j])%m;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) D[i][j]=(D[i][j]+tmp[i][j])%m;
}
pow(k/2);
for (int i=1;i<=n;i++) B[i][i]=(B[i][i]+1)%m;
update();
k>>=1;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) B[i][j]=A[i][j];
update();
for (int i=1;i<=n;i++) {
for (int j=1;j<=n;j++) printf("%d ",(ans[i][j]+D[i][j])%m);
printf("\n");
}
return 0;
}

  

【poj3233】 Matrix Power Series的更多相关文章

  1. 【POJ 3233】Matrix Power Series

    [题目链接] 点击打开链接 [算法] 要求 A^1 + A^2 + A^3 + ... + A^k 考虑通过二分来计算这个式子 : 令f(k) = A^1 + A^2 + A ^ 3 + ... + ...

  2. POJ3233 [C - Matrix Power Series] 矩阵乘法

    解题思路 题目里要求\(\sum_{i=1}^kA^i\),我们不妨再加上一个单位矩阵,求\(\sum_{i=0}^kA^i\).然后我们发现这个式子可以写成这样的形式:\(A(A(A...)+E)+ ...

  3. POJ3233:Matrix Power Series

    对n<=30(其实可以100)大小的矩阵A求A^1+A^2+……+A^K,K<=1e9,A中的数%m. 从K的二进制位入手.K分解二进制,比如10110,令F[i]=A^1+A^2+……+ ...

  4. POJ 3233 Matrix Power Series(二分等比求和)

    Matrix Power Series [题目链接]Matrix Power Series [题目类型]二分等比求和 &题解: 这题我原来用vector写的,总是超时,不知道为什么,之后就改用 ...

  5. 构造矩阵解决这个问题 【nyoj299 Matrix Power Series】

    矩阵的又一个新使用方法,构造矩阵进行高速幂. 比方拿 nyoj299 Matrix Power Series 来说 给出这样一个递推式: S = A + A2 + A3 + - + Ak. 让你求s. ...

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

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

  7. 矩阵十点【两】 poj 1575 Tr A poj 3233 Matrix Power Series

    poj 1575  Tr A 主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1575 题目大意:A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的 ...

  8. [POJ3233]Matrix Power Series 分治+矩阵

    本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia [POJ3233]Matrix Power Series 分治+矩阵 题目大意 A为n×n(n<= ...

  9. POJ3233 Matrix Power Series 矩阵快速幂 矩阵中的矩阵

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

随机推荐

  1. np问题

    NP(np) Time Limit:1000ms Memory Limit:64MB 题目描述 LYK 喜欢研究一些比较困难的问题,比如 np 问题.这次它又遇到一个棘手的 np 问题.问题是这个样子 ...

  2. Params 方法参数

    params,ref,out 方法参数 示例 在下面的方法使用中 OpenWindow(params object[] args) 传递的参数args添加了params修饰 public void O ...

  3. Studio 从入门到精通 (一)

    目标:Android Studio新手–>下载安装配置–>零基础入门–>基本使用–>调试技能–>构建项目基础–>使用AS应对常规应用开发 AS简介 经过2年时间的研 ...

  4. shell+curl监控网站页面(域名访问状态),并利用sedemail发送邮件

    应领导要求,对公司几个主要站点的域名访问情况进行监控.下面分享一个监控脚本,并利用sendemail进行邮件发送. 监控脚本如下:下面是写了一个多线程的网站状态检测脚本,直接从文件中读出站点地址,然后 ...

  5. jquery.validate运用和扩展

    一.运用 默认校验规则 ().required:true 必输字段 ().remote:"remote-valid.jsp" 使用ajax方法调用remote-valid.jsp验 ...

  6. 一个DOM元素绑定多个事件时,先执行冒泡还是捕获

    绑定在被点击元素的事件是按照代码顺序发生,其他元素通过冒泡或者捕获“感知”的事件,按照W3C的标准,先发生捕获事件,后发生冒泡事件.所有事件的顺序是:其他元素捕获阶段事件 -> 本元素代码顺序事 ...

  7. C语言 读取文件中特定数据

    //读取文件数据 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> struct jia ...

  8. ZooKeeper学习第五期--ZooKeeper管理分布式环境中的数据

    引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法.Zab协议.通信协议等相关知识,理解起来比较抽象所以还需要借助一些应用场景,来帮我们 ...

  9. 使用WITH AS提高性能简化嵌套SQL(转)

    http://www.cnblogs.com/fygh/archive/2011/08/31/2160266.html 一.WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery ...

  10. xp-win7-win8的基础到精通教程-系统优化减肥教程-windos装mac

    是否还在使用别人封装的系统?是否还在担心下载后的系统是有病毒的?还在为 安装好新系统后,里面安装的软件全是自己不需要的?担心流氓软件绑定浏览器主页?担心 系统重装后,自己所有的编程软件都需要重新安装? ...