codeforces 678D Iterated Linear Function 矩阵快速幂
2016-06-22 21:36
465 查看
矩阵快速幂的题要多做
由题可得 g
=A*g[n-1]+B
所以构造矩阵 { g
} = {A B} * { g[n-1]}
{ 1 } {0 1} { 1 }
然后矩阵快速幂就好 矩阵快速幂的题要多做,多构造矩阵
注:其实这个题可以直接等比数列求求和,单数矩阵快速幂对于这类题更具有普遍性
View Code
由题可得 g
=A*g[n-1]+B
所以构造矩阵 { g
} = {A B} * { g[n-1]}
{ 1 } {0 1} { 1 }
然后矩阵快速幂就好 矩阵快速幂的题要多做,多构造矩阵
注:其实这个题可以直接等比数列求求和,单数矩阵快速幂对于这类题更具有普遍性
#include <cstdio> #include <iostream> #include <ctime> #include <vector> #include <cmath> #include <map> #include <queue> #include <algorithm> #include <cstring> using namespace std; typedef long long LL; const int N=5e2+5; const int INF=0x3f3f3f3f; const LL mod=1e9+7; LL res[2][2],cur[2][2],a,b,n,x,tmp[2][2]; void mul(LL x[2][2],LL y[2][2]) { memset(tmp,0,sizeof(tmp)); for(int i=0;i<2;++i) for(int j=0;j<2;++j) for(int k=0;k<2;++k) tmp[i][j]=(tmp[i][j]+x[i][k]*y[k][j]%mod)%mod; for(int i=0;i<2;++i) for(int j=0;j<2;++j) x[i][j]=tmp[i][j]; } void rec_quick_mod(){ for(int i=0;i<2;++i) for(int j=0;j<2;++j) res[i][j]=(i==j); while(n){ if(n&1)mul(res,cur); n>>=1; mul(cur,cur); } } int main() { scanf("%I64d%I64d%I64d%I64d",&a,&b,&n,&x); cur[0][0]=a;cur[0][1]=b;cur[1][0]=0;cur[1][1]=1; rec_quick_mod(); LL ret=(res[0][0]*x%mod+res[0][1])%mod; printf("%I64d\n",ret); return 0; }
View Code
相关文章推荐
- JDK安装目录下的src
- 术语介绍
- hibernate study
- php四种基础算法:冒泡,选择,插入和快速排序法
- Android基于Google Zxing实现二维码/条形码扫描、生成二维码/条形码
- 总结
- 第七周学习进度条
- 查询每个年龄的顾客消费金额数的SQL语句
- c/c++中的static
- android-AccessibilityManager
- 明清时期江右商的宗族教育——江西流坑村的历史人类学考察
- Javascript 排序数组或对象
- 理解typename的两个含义
- 《人月神话》阅读笔记02
- C/C+语言struct深层探索
- java内存模型的理解
- 离散特征之间的相关性
- static 小结
- 多线程
- Java中的重载与重写