【算法】二分+矩阵快速幂

【题意】给定矩阵A和整数k,MOD,求A^0+A^1+A^2+...+A^k。

【题解】

定义题目要求的答案为f(n),即:

$$f_n=\sum_{i=0}^{n}A^i$$

当n为偶数时,可以拆成两半,后一半由前一半集体乘A(n/2)得到,即:

$$f_n=f_{\frac{n}{2}}(A^{\frac{n}{2}}+1)$$

当n为奇数时,直接递推:

$$f_n=f_{n-1}*A^n$$

复杂度O(n^3 log k)。

快速幂的单位矩阵是主对角线(左上到右下)全为1,其余全为0,不用memset就超时了,多用stdio.h。

#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const int maxn=;
int n,MOD,kind;
struct Mat{ll a[maxn][maxn];}A; Mat ch(Mat a,Mat b){
Mat tmp;
memset(tmp.a,,sizeof(tmp.a));
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
tmp.a[i][j]=(tmp.a[i][j]+a.a[i][k]*b.a[k][j])%MOD;
return tmp;
}
Mat pow(int k){
Mat tmp=A,ans;
memset(ans.a,,sizeof(ans.a));
for(int i=;i<=n;i++)ans.a[i][i]=;
//快速幂初值为1(单位矩阵)!!!
while(k>){
if(k&)ans=ch(ans,tmp);
tmp=ch(tmp,tmp);
k>>=;
}
return ans;
}
Mat plus(Mat a,Mat b){
Mat tmp;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)tmp.a[i][j]=(a.a[i][j]+b.a[i][j])%MOD;
return tmp;
}
Mat calc(int k){
Mat tmp;
if(k<=)return A;
if(k&){
tmp=plus(calc(k-),pow(k));
}
else{
Mat tmps=calc(k/);
tmp=plus(tmps,ch(tmps,pow(k/)));
}
return tmp;
}
int main(){
scanf("%d%d%d",&n,&kind,&MOD);
for(int i=;i<=n;i++)for(int j=;j<=n;j++)scanf("%lld",&A.a[i][j]);
Mat ans=calc(kind);
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)printf("%lld ",ans.a[i][j]%MOD);
printf("\n");
}
return ;
}

还有一道题:HDU1588 Gauss Fibonacci

给定k,b,n,m,求:

$$ans=\sum_{i=0}^{n-1}Fib(k*i+b) \ \ mod \ \ m$$

定义A^i表示Fib(i)的斐波那契矩阵(见Fibonacci,左下角项),那么:

$$sum=A^b \times \sum_{i=0}^{n-1}(A^k)^i \ \ mod \ \ m$$

后面将$A^k$视为整体后,就是本题的套路了。

 

【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 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的迹(就是主对角线上各项的 ...

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

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

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

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

  5. [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:  ...

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

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

  7. 线性代数(矩阵乘法):POJ 3233 Matrix Power Series

    Matrix Power Series   Description Given a n × n matrix A and a positive integer k, find the sum S = ...

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

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

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

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

随机推荐

  1. .net 错误处理

    第一步在页面中写OnError方法: protected override void OnError(EventArgs e) { Exception ex = Server.GetLastError ...

  2. TCP系列44—拥塞控制—7、SACK关闭的快速恢复

    ) return;    delta = ssthresh - in_flight;     prr_delivered += newly_acked_sacked; if (delta < 0 ...

  3. 1029 C语言文法定义

    program à external_declaration | program external_declaration <源程序> ->  <外部声明> |  < ...

  4. B-2阶段组员分数分配

    组名: 新蜂 组长: 武志远 组员: 宫成荣 谢孝淼 杨柳 李峤 项目名称: java俄罗斯方块 武 武 武 武 杨 宫 宫 杨 宫 谢 李 杨 李 谢 李 谢 李 谢 杨 宫 扬 谢 宫 李 武 评 ...

  5. pcap的安装与配置

    1.打开网址:www.tcpdump.org/ 下载 libpcap-1.0.0.tar.gz (512.0KB) 软件包,通过命令 tar zxvf libpcap-1.0.0.tar.gz 解压文 ...

  6. static关键字的新用法

    static关键字的新用法和总结: static这个关键字,也可以像“self”一样,代表“当前类”,用于访问一个类的“静态属性或静态方法”: 但, static,在应用中,更灵活,因此更常见! 因为 ...

  7. PHP对象类型转换

    其他数据类型转换为对象类型 其他数据类型转换为对象类型,得到的结果是:内置标准类(stdclass)的一个对象! 语法形式为: $obj1  =  (object) 其他类型数据: 数组转换为对象:数 ...

  8. solrCloud源码分析之CloudSolrClient

    CloudSolrClient是solrj提供的客户端与solrCloud交互的类.该类的实例与zookeeper进行通信来确定solrCloud collections中的solr endpoint ...

  9. git 恢复单个文件

    首先查看该文件的历史版本信息:git log Default@2x.png 记录下需要恢复的commit版本号:如 9aa51d89799716aa68cff3f30c26f8815408e926 恢 ...

  10. BZOJ3712 PA2014Fiolki(kruskal重构树)

    对合并过程建树.然后只需要按照时间顺序考虑每个反应就行了,时间顺序根据lca的深度确定. #include<iostream> #include<cstdio> #includ ...