uva4686(矩阵快速幂)
来源:互联网 发布:游戏锁定方框软件 编辑:程序博客网 时间:2024/06/04 21:56
题意:a 0 = A0
a i = a i-1*AX+AY
b 0 = B0
a i = a i-1*AX+AY
b 0 = B0
b i = b i-1*BX+BY 让你求
题解:ai*bi = a i-1*AX*bi-1*BX+a i-1*AX*BY+b i-1*BX*AY+AY*BY
然后可以用矩阵方程为下图:
接着跑个快速幂即可
#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;typedef long long int ll;const int mod = 1e9+7;struct mat{ ll a[5][5]; mat operator*(const mat &y)const{ mat z; for(int i = 0; i < 5; i++) for(int j = 0; j < 5; j++){ z.a[i][j] = 0; for(int k = 0; k < 5; k++) z.a[i][j] = (z.a[i][j]+a[i][k]*y.a[k][j]%mod)%mod; } return z; }};ll a0,ax,ay,b0,bx,by;mat quick(ll n){ n--; mat ans = {a0*b0%mod,0,0,0,0,a0*b0%mod,0,0,0,0,a0,0,0,0,0,b0,0,0,0,0,1,0,0,0,0}; mat x = {1,ax*bx%mod,ax*by%mod,bx*ay%mod,ay*by%mod,0,ax*bx%mod,ax*by%mod,bx*ay%mod,ay*by%mod,0,0,ax,0,ay,0,0,0,bx,by,0,0,0,0,1}; while(n){ if(n&1) ans = x*ans; x = x*x; n /= 2; } return ans;}int main(){ ll n; while(scanf("%lld",&n)==1){ scanf("%lld%lld%lld",&a0,&ax,&ay); scanf("%lld%lld%lld",&b0,&bx,&by); if(n==0){ puts("0"); continue; } a0 %= mod; ax %= mod; ay %= mod; b0 %= mod; bx %= mod; by %= mod; mat ans = quick(n); printf("%lld\n",ans.a[0][0]%mod); } return 0;}
阅读全文
0 0
- uva4686(矩阵快速幂)
- poj3070(矩阵快速幂,矩阵乘法)
- UVA10655矩阵快速幂(构造矩阵)
- 快速幂,矩阵快速幂(模板)
- 快速幂(矩阵快速幂)
- 快速矩阵快速幂
- 矩阵相关(研究总结,矩阵,矩阵快速幂)
- 矩阵快速幂(模板)
- hdu2604(矩阵快速幂)
- hdu4968(矩阵快速幂)
- hdu5015(矩阵快速幂)
- Evolution(矩阵快速幂)
- 拼图(矩阵快速幂)
- HDU5171(矩阵快速幂)
- (矩阵快速幂)HDU5667
- Hdu1757(矩阵快速幂)
- HDU1005(矩阵快速幂)
- 数学题(矩阵快速幂)
- 《算法4》图&深度优先与广度优先算法
- CCF-201709-2-公共钥匙盒
- CCPC.2017哈尔滨站-重现赛-B(二分)
- STM32开发环境搭建
- 软件工程(C编码实践篇)学习总结
- uva4686(矩阵快速幂)
- 就算这个世界拒绝了你——也不放弃未来
- 创建maven项目及遇到的问题
- HDU
- vim 配置
- FZU
- 【1701H1】【穆晨】【171111】连续第三十二天总结
- STL算法-归并和最大最小值算法
- C++MFC窗体和Dos命令窗口中如何使用字符串