本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia

[POJ3233]Matrix Power Series 分治+矩阵

题目大意

A为n×n(n<=30)的矩阵,让你求

\(\sum\limits_{i=1}^{k}A^i\)

并将答案对取模p

输入格式:

有多组测试数据,其中第一行有3个正整数,为n,k(k<=\(10^9\)),p(p<=\(10^4\))

后面有n行,每行n个数。

输出格式:

输出最后答案的矩阵。

输入输出样例

input

2 2 4

0 1

1 1

output

1 2

2 3

解题分析

首先,这道题k有10^9,肯定不能O(n)推过去,但我们发现这个随着k递增ans是严格递增的,并且满足一定的规律,在这里我们想到了分治。

我们先取答案的一半,尝试怎么凑出这个答案

我们让 \(a=\sum\limits_{i=1}^{k\over2}A^i,b=A^{k\over2}\)

我们发现,

如果 $k\mod2==0 $ 则

\(\sum\limits_{i=1}^{k}A^i=\sum\limits_{i=1}^{k\over2}A^i+\sum\limits_{i={k\over2}+1}^{k}A^i=\sum\limits_{i=1}^{k\over2}A^i+(\sum\limits_{i=1}^{k\over2}A^i*A^{k\over2})=a+a*b\)

怎么理解呢,可以认为我们用\(A^{k\over2}\)将\(\sum\limits_{i=1}^{k\over2}A^i\)的指数补成\(\sum\limits_{i={k\over2}+1}^{k}A^i\)。

所以,我们可以很容易推出当k为奇数的情况,只要将最后一位补上就可以。

\(\sum\limits_{i=1}^{k}A^i=\sum\limits_{i=1}^{k\over2}A^i+(\sum\limits_{i=1}^{k\over2}A^i*A^{k\over2})+A^k=a+a*b+b^2*A\)

这样,就可以在\(O(log_2n)\)出解了。

矩阵乘法加法就不多说了。

#include <cstdio>
#include <iostream>
#include <cmath>
#include <queue>
#include <algorithm>
#include <cstring>
#include <climits>
#define MAXN 50+10 using namespace std;
int p,n,k;
struct matrix{
int n,m;
int data[MAXN][MAXN];
void read(int x,int y)
{
n=x,m=y;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&data[i][j]);
}
void print()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
printf("%d ",data[i][j]);
printf("\n");
}
}
matrix operator * (matrix b)
{
matrix ans;
memset(ans.data,0,sizeof(ans.data));
ans.n=n;ans.m=b.m;
for(int i=1;i<=ans.n;i++) for(int j=1;j<=ans.m;j++) for(int k=1;k<=m;k++)
ans.data[i][j]+=data[i][k]*b.data[k][j],ans.data[i][j]%=p;
return ans;
}
matrix operator + (matrix b)
{
matrix ans;
memset(ans.data,0,sizeof(ans.data));
ans.n=n;ans.m=m;
for(int i=1;i<=ans.n;i++) for(int j=1;j<=ans.m;j++)
ans.data[i][j]=(data[i][j]+b.data[i][j])%p;
return ans;
}
}a,b,c,z;
void halfsort(matrix x,int y)
{
if(y==1) {c=x;b=x;return ;}
else
{
halfsort(x,y/2);
if(y%2==0)
{
b=b+(b*c);
c=c*c;
}else
{
b=b+(b*c);
b=b+(x*c*c);
c=c*c;c=c*x;
}
}
}
int main()
{
while(scanf("%d%d%d",&n,&k,&p)!=EOF)
{
a=z;b=z;c=z;
a.read(n,n);
halfsort(a,k);
b.print();
}
return 0;
}

[POJ3233]Matrix Power Series 分治+矩阵的更多相关文章

  1. poj3233 Matrix Power Series(矩阵快速幂)

    题目要求的是 A+A2+...+Ak,而不是单个矩阵的幂. 那么可以构造一个分块的辅助矩阵 S,其中 A 为原矩阵,E 为单位矩阵,O 为0矩阵    将 S 取幂,会发现一个特性: Sk +1右上角 ...

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

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

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

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

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

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

  5. POJ3233]Matrix Power Series && [HDU1588]Gauss Fibonacci

    题目:Matrix Power Series 传送门:http://poj.org/problem?id=3233 分析: 方法一:引用Matrix67大佬的矩阵十题:这道题两次二分,相当经典.首先我 ...

  6. 题解报告:poj 3233 Matrix Power Series(矩阵快速幂)

    题目链接:http://poj.org/problem?id=3233 Description Given a n × n matrix A and a positive integer k, fin ...

  7. POJ3233 Matrix Power Series(矩阵快速幂+分治)

    Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak. ...

  8. POJ3233:Matrix Power Series(矩阵快速幂+二分)

    http://poj.org/problem?id=3233 题目大意:给定矩阵A,求A + A^2 + A^3 + … + A^k的结果(两个矩阵相加就是对应位置分别相加).输出的数据mod m.k ...

  9. POJ3233:Matrix Power Series(矩阵快速幂+递推式)

    传送门 题意 给出n,m,k,求 \[\sum_{i=1}^kA^i\] A是矩阵 分析 我们首先会想到等比公式,然后得到这样一个式子: \[\frac{A^{k+1}-E}{A-E}\] 发现要用矩 ...

随机推荐

  1. C#中的==和Equals

    == 和 Equals 简要:==比较栈上的内容,Equals比较堆上的内容 object x = 5, y = 5; Console.WriteLine(x == y); // "==&q ...

  2. rabbitMQ学习笔记(三) 消息确认与公平调度消费者

    从本节开始称Sender为生产者 , Recv为消费者   一.消息确认 为了确保消息一定被消费者处理,rabbitMQ提供了消息确认功能,就是在消费者处理完任务之后,就给服务器一个回馈,服务器就会将 ...

  3. Keyboard的显示与隐藏

    一个控制键盘显示与隐藏的工具类分享给大家 public class KeyBoardTool { /** * 假设输入法在窗体上已经显示.则隐藏.反之则显示 * @param context */ p ...

  4. 树莓派 rtl8188eu 芯片wifi驱动

    总算是找到了.现拿出来分享.參考地址:https://www.raspberrypi.org/forums/viewtopic.php? p=462982#p462982 下载的地址是:https:/ ...

  5. poj 3259 Wormholes 【SPFA&amp;&amp;推断负环】

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 36852   Accepted: 13502 Descr ...

  6. Tween动画TranslateAnimation细节介绍

    Tween动画有下面这几种: Animation   动画 AlphaAnimation 渐变透明度 RotateAnimation 画面旋转 ScaleAnimation 渐变尺寸缩放 Transl ...

  7. NOI.AC: NOIP2018 全国模拟赛习题练习

    闲谈: 最后一个星期还是不浪了,做一下模拟赛(还是有点小虚) #30.candy 题目: 有一个人想买糖吃,有两家商店A,B,A商店中第i个糖果的愉悦度为Ai,B商店中第i个糖果的愉悦度为Bi 给出n ...

  8. 0x05 排序

    说是排序结果就是各种奇技淫巧 中位数被坑多了久病成医,例题一题搞笑一题糖果传递(昨晚精神那么好效率还那么差) #include<cstdio> #include<iostream&g ...

  9. 客户端通过wcf来启动或者停止服务器上的windows service

    1.设置服务器上的windows service的security,下面的命令只能用cmd.exe来运行(以管理员模式) sc sdset "LISA_43_Dev_Batch" ...

  10. Oracle的awr和ash

    1.     10g之前 用户的连接将产生会话,当前会话记录保存在v$session中:处于等待状态的会话会被复制一份放在v$session_wait中.当该连接断开后,其原来的连接信息在v$sess ...