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

题目意思:给一个矩阵n*n的矩阵A和一个k,求一个式子 S = A + A2 + A3 + … + Ak。

这个需要用到等比数列和的二分加速。

当n为奇数的时候,Sn=Sn-1+A^k;

当n为偶数的时候,Sn=(S[n/2]+E)*A^(k/2)

自己xjb推一下就知道等比数列和的二分加速是咋回事了。我举个例子,我们假设求等比数列2,4,8,16,32,64的和s=(8+1)*(2+4+8),而2+4+8=(2+4)+8,而(2+4)=(2+1)*2,其他的可以一次类推。

这个过程我们可以直接用一个递归过程算出来,其余我们套用矩阵快速幂的模板就好了。

代码:

 //Author: xiaowuga
#include<iostream>
#include<cstring>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
#define size 35
using namespace std;
typedef long long ll;
int n,k,mod;
struct Mat{
int mat[size][size];
void clear(){
memset(mat,,sizeof(mat));
} Mat operator *(const Mat &e) const{
Mat tmp;
tmp.clear();
for(int k=;k<n;k++)
for(int i=;i<n;i++){
if(mat[i][k]==) continue;
for(int j=;j<n;j++){
if(e.mat[k][j]==) continue;
tmp.mat[i][j]+=mat[i][k]*e.mat[k][j]%mod;
tmp.mat[i][j]%=mod;
}
}
return tmp;
}
Mat operator +(const Mat &e) const{
Mat tmp;
tmp.clear();
for(int i=;i<n;i++){
for(int j=;j<n;j++){
tmp.mat[i][j]=(mat[i][j]%mod+e.mat[i][j]%mod)%mod;
}
}
return tmp;
}
};
Mat m,E;
Mat pow(Mat ma,ll num){
Mat ans;
ans.clear();
for(int i=;i<n;i++) ans.mat[i][i]=;
while(num){
if(num&) ans=ans*ma;
num/=;
ma=ma*ma;
}
return ans;
}
Mat fun(int x){
if(x==) return m;
if(x&) return fun(x-)+pow(m,x);
else return (pow(m,x/)+E)*fun(x/);
}
int main() {
ios::sync_with_stdio(false);cin.tie();
cin>>n>>k>>mod;
E.clear();
for(int i=;i<n;i++) E.mat[i][i]=;
for(int i=;i<n;i++)
for(int j=;j<n;j++) cin>>m.mat[i][j];
Mat ans=fun(k);
for(int i=;i<n;i++){
for(int j=;j<n;j++)
cout<<ans.mat[i][j]<<" ";
cout<<endl;
}
return ;
}

poj3233—Matrix Power Series的更多相关文章

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

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

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

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

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

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

  4. POJ3233 Matrix Power Series

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

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

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

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

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

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

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

  8. POJ-3233 Matrix Power Series 矩阵A^1+A^2+A^3...求和转化

    S(k)=A^1+A^2...+A^k. 保利求解就超时了,我们考虑一下当k为偶数的情况,A^1+A^2+A^3+A^4...+A^k,取其中前一半A^1+A^2...A^k/2,后一半提取公共矩阵A ...

  9. POJ3233 Matrix Power Series(快速幂求等比矩阵和)

    题面 \(solution:\) 首先,如果题目只要我们求\(A^K\) 那这一题我们可以直接模版矩乘快速幂来做,但是它现在让我们求$\sum_{i=1}^{k}{(A^i)} $ 所以我们思考一下这 ...

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

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

随机推荐

  1. redis基础之安装和配置(一)

    前言 折腾一下redis在linux环境的安装. ubantu16.04环境下安装 下载安装,依次执行命令; # 从官方网站下载安装包,注意,当前在哪个目录下执行命令,下载的包将在哪个目录下 $ wg ...

  2. jinja2问题集锦

    用jinja2写模板的时候遇到了一些问题,记录一下 抽出base.html作为模板 之前的小项目写得都很不规范,模板都是能用就行,基本上只用到if语句,for语句和变量.导航栏都是复制粘贴,没有把共同 ...

  3. iPhone4 降级6.12教程 无须SHSH 不装插件 不睡死[转载] by 轻鸢

    无shsh降级电脑系统,细节操作等其它影响因素较多,不确保每个人都能成功,楼主发帖前刷机几十次均成功.步骤有些繁琐,按照步骤每一步都正确可保证最后不睡死 注意一下,无SHSH降级都是不完美的,开机需要 ...

  4. 基于Redis实现延时队列服务

    背景 在业务发展过程中,会出现一些需要延时处理的场景,比如: a.订单下单之后超过30分钟用户未支付,需要取消订单 b.订单一些评论,如果48h用户未对商家评论,系统会自动产生一条默认评论 c.点我达 ...

  5. 算法图绘制工具Graphviz

    graphviz是贝尔实验室设计的一个开源的画图工具,它的强大主要体现在“所思即所得"(WYTIWYG,what you think is what you get),这是和office的“ ...

  6. LinkQ 组合查询与分页

    1.以开头查 public List<Car> Select1(string a){ return con.Car.Where(r => r.Name.StartsWith(a)). ...

  7. js 刷新后不提示并保留控件状态

    保存后,想提示一下并保留查询条件的状态,发现可以用document.forms[0].submit();继续提交达到刷新的目的 代码如下: ScriptManager.RegisterStartupS ...

  8. mysql_windows解压包安装

    WIN下安装64位的解压版mysql-5.6.24-winx64 参考如下安装步骤: 1.将解压缩后的文件放到自己想要的地方 并配置环境变量. 示例中存放的目录为:D:\Program Files\m ...

  9. Centsos7修改密码

    CentOS 7.0 进入单用户模式修改Root密码 时间:2017-05-02 01:10来源:blog.csdn.net  作者:海哥_大大的Java 举报   点击:506次 一.启动时,随便按 ...

  10. python文件编码说明 coding=utf-8

    python 支持3种编码声明,一般常用能见到下面两种 1.# -*- coding: utf-8 -*- 这种写法是为了兼容Emacs的编码声明 2.短一点,但Emacs不能用# coding=ut ...