【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: ...
随机推荐
- DEBUG_NEW和THIS_FILE
C++ 的一个 比较晦涩难懂的特点是你可以重载 new 操作符,并且你甚至可以给它附加参数.通常,操作符 new 只接受拟分配对象的大小: void* operator new(size ...
- 七周七语言之用ruby做点什么
如果你想获得更好的阅读体验,可以前往我在 github 上的博客进行阅读,http://lcomplete.github.io/blog/2013/05/25/sevenlang-ruby/. 每学一 ...
- exce族函数详解
exec函数族 函数族说明 fork() 函数用于创建一个新的子进程,该子进程几乎复制了父进程的全部内容,但是,这个新创建的子进程如何执行呢?exec 函数族就提供了一个在进程中启动另一个程序执行的方 ...
- 对xml的操作使用的类XElement的使用
操作xml的类比较多,发现XElement类操作xml极其方便,下面列举一些操作方法 1.创建xml XElement xml = new XElement("root", new ...
- InnoDB事务日志(redo log 和 undo log)详解
数据库通常借助日志来实现事务,常见的有undo log.redo log,undo/redo log都能保证事务特性,undolog实现事务原子性,redolog实现事务的持久性. 为了最大程度避免数 ...
- windows 10上利用Microsoft RTF文件(CVE-2017-0199)进行攻击
Microsoft Word下的恶意RTF文件容易被收到攻击,在本文中,我们使用python脚本对Microsoft Word 2013进行oday攻击演示,该脚本会生成恶意的.rtf文件,并提供目标 ...
- Linux (四)其他一些服务的实现
一.防火墙 防火墙根据配置文件/etc/sysconfig/iptables 来控制本机的“出.入”网络访问行为 其对行为的配置策略有四个策略表 1. 基础必备技能 查看防火墙状态 ...
- C++11新利器
C++11常用特性的使用经验总结 unordered_map可能用的会比较多 省的写哈希表了. 但是浪费空间
- 女神(goddess)——组合数学
出自某模拟赛. 题目大意: 对1e9+7取模. 数据范围 20 % : n<=300 40 % : n<=2,000 50 % : n<=10,000 70 % : n<=1 ...
- day2-python基础