【POJ】3233 Matrix Power Series
【算法】二分+矩阵快速幂
【题意】给定矩阵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的更多相关文章
- POJ 3233 Matrix Power Series 【经典矩阵快速幂+二分】
任意门:http://poj.org/problem?id=3233 Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K To ...
- 矩阵十点【两】 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的迹(就是主对角线上各项的 ...
- POJ 3233 Matrix Power Series(二分等比求和)
Matrix Power Series [题目链接]Matrix Power Series [题目类型]二分等比求和 &题解: 这题我原来用vector写的,总是超时,不知道为什么,之后就改用 ...
- POJ 3233 Matrix Power Series (矩阵乘法)
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 11954 Accepted: ...
- [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: ...
- Poj 3233 Matrix Power Series(矩阵乘法)
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Description Given a n × n matrix A and ...
- 线性代数(矩阵乘法):POJ 3233 Matrix Power Series
Matrix Power Series Description Given a n × n matrix A and a positive integer k, find the sum S = ...
- POJ 3233 Matrix Power Series(矩阵快速幂)
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 19338 Accepted: 8161 ...
- poj 3233 Matrix Power Series(矩阵二分,高速幂)
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 15739 Accepted: ...
随机推荐
- Alpha-6
前言 失心疯病源6 团队代码管理github 站立会议 队名:PMS 530雨勤(组长) 今天完成了那些任务 18:30~20:30 完成blob类下关于预测车辆下一个位置的函数 代码签入github ...
- Spring – 缓存注解
Spring缓存抽象概述 Spring框架自身并没有实现缓存解决方案,但是从3.1开始定义了org.springframework.cache.Cache和org.springframework.ca ...
- Markdown语法实践
Markdown语法实践 Markdown基本语法 1.标题 # 一级标题 ## 二级标题 ### 三级标题 eg: 一级标题 二级标题 三级标题 2.链接 标准: [Title](URL) 实例: ...
- ping(团队作业)
一,团队成员 何守成 031602408(队长) 黄锦峰 031602411 肖逸清 031602435 张子纯 031602441 蔡志斌 031602602 柯叶祥 031602414 二.作业链 ...
- eclipse生成jar包 注意事项!
原文转自:http://www.cnblogs.com/zhangfei/archive/2013/01/22/2871075.html 第一:普通类导出jar包,我说的普通类就是指此类包含main方 ...
- IDEA中Git的更新/提交/还原方法
记录一下在IDEA上怎样将写的代码提交到GitHub远程库: 下面这个图是基本的提交代码的顺序: 1. 将代码Add到stage暂存区本地修改了代码后,需先将代码add到暂存区,最后才能真正提价到gi ...
- 【Nginx】均衡负载权重模式实现session数据同步
思路:把session存放到一个公共redis服务器上 每次浏览器请求服务端都会带上cookie,因为使用的是权重负载均衡方案,因此nginx反向代理服务器会把请求发放到不同的服务端,服务端用cook ...
- 微信小程序 功能函数 touch触摸计时
shiFN:function(e){ // touchstart // touchend let that=this; let n=0; // 判断是开始还是结束的参数 let textTure = ...
- p2 关节
P2中使用Constraint及其子类表示关节,也就是将两个刚体按照指定的规则约束在一起,形成有规律的.相互限制的运动模拟.P2关节模拟中,两个刚体没有通过任何刚体连接,只是通过算法模拟出关节运动轨迹 ...
- saltstack进阶
查看minion端的文件内容 [root@linux-node2 ~]# cat /etc/resolv.conf # Generated by NetworkManager nameserver 1 ...