HDU 4686 Arc of Dream(矩阵快速幂)
来源:互联网 发布:网络信息安全的概念 编辑:程序博客网 时间:2024/05/02 04:59
大意:已知 a0 = A0
ai = ai-1*AX+AY
b0 = B0
bi = bi-1*BX+BY
What is the value of AoD(N) modulo 1,000,000,007?
思路:已知an,bn是一个递推式,AoD(n)也是一个递推式,所以试想用一个快速幂解决。那么就应该把a0,b0,ax,ay,bx,by代进去构成一个式子。那么就可以构造矩阵了。因为an,bn,AoD,都需要求所以根据需要构成一个7*7的矩阵。
那么什么又是最后的答案呢?肯定是构造矩阵连乘后的结果乘以初始值。
(PS:n可能为0,优化一下)
#include<map>#include<cmath>#include<queue>#include<cmath>#include<string>#include<cstdio>#include<stack>#include<iostream>#include<cstring>#include<algorithm>#define inf 0x3f3f3f3f#define eps 1e-8#define ls l,mid,rt<<1#define rs mid+1,rt,rt<<1|1#define LL __int64using namespace std;__int64 mod = 1000000007,MOD = 1000000007,N=7;__int64 a,ax,ay,b,bx,by,n;struct node{ __int64 r[10][10];}q;node matrix_pow(node a,node b){ __int64 i,j,k; node t; memset(t.r,0,sizeof(t.r)); for(k = 0;k < 7;++ k){ for(i = 0 ;i < 7;++ i){ for(j = 0;j < 7;++ j){ t.r[i][j] = (t.r[i][j]+ (a.r[i][k]*b.r[k][j]))%mod; } } } return t;}node so(node q,__int64 m){ __int64 i,j,k; node tmp; memset(tmp.r,0,sizeof(tmp.r)); for(i = 0;i < N;++ i ) tmp.r[i][i] = 1; while(m){ if(m&1) tmp = matrix_pow(tmp,q); q = matrix_pow(q,q); m = m >> 1; } __int64 sum = 0; sum += tmp.r[N-1][0]*(a*b%MOD)%MOD; sum %= MOD; sum += tmp.r[N-1][1]*a%MOD; sum %= MOD; sum += tmp.r[N-1][2]*b%MOD; sum %= MOD; sum += tmp.r[N-1][3]*(ay*by%MOD)%MOD; sum %= MOD; sum += tmp.r[N-1][4]*ay%MOD; sum %= MOD; sum += tmp.r[N-1][5]*by%MOD; sum %= MOD; printf("%I64d\n",sum);}int main(){ __int64 m,k,i,j; while(~scanf("%I64d",&n)){ scanf("%I64d%I64d%I64d%I64d%I64d%I64d",&a,&ax,&ay,&b,&bx,&by); memset(q.r,0,sizeof(q.r)); q.r[0][0] = ax*bx%mod; q.r[0][2] = bx*ay%mod; q.r[0][1] = ax*by%mod; q.r[0][3] = 1; q.r[1][1] = ax%mod; q.r[1][4] = 1; q.r[2][2] = bx%mod; q.r[2][5] = 1; q.r[3][3] = 1;q.r[4][4] = 1; q.r[5][5] = 1; q.r[6][6] = q.r[6][0] = 1; q = so(q,n); } return 0;}
0 0
- hdu 4686 Arc of Dream(构造矩阵快速幂)
- hdu 4686 Arc of Dream(矩阵快速幂)
- HDU 4686 Arc of Dream(矩阵快速幂)
- HDU 4686 Arc of Dream(矩阵快速幂)
- HDU 4686 Arc of Dream(矩阵快速幂)
- hdu 4686 Arc of Dream(矩阵快速幂)
- HDU 4686 Arc of Dream(矩阵快速幂)
- HDU 4686 Arc of Dream(矩阵快速幂)
- HDU 4686 Arc of Dream(矩阵快速幂!)
- HDU 4686 Arc of Dream(构造矩阵 快速幂)
- hdu 4686 Arc of Dream 矩阵快速幂
- HDU 4686 Arc of Dream(矩阵快速幂)
- hdu 4686 Arc of Dream 矩阵快速幂
- Hdu 4686 Arc of Dream 矩阵快速幂
- HDU 4686 Arc of Dream 矩阵快速幂
- HDU - 4686 Arc of Dream 矩阵快速幂
- hdu 4686 Arc of Dream【矩阵快速幂】
- HDU 4686 Arc of Dream (矩阵快速幂)
- 2014蓝桥杯决赛 本科B组 生物芯片
- Android 欢迎界面的实现(带透明度动画)
- objective-c中的消息响应机制
- 【慕课笔记】3-2 应用SAX方式解析XML—使用SAX解析XML文件的节点属性
- Java-单机版的书店管理系统(练习设计模块和思想_系列 三 )
- HDU 4686 Arc of Dream(矩阵快速幂)
- FAT32文件系统的存储组织结构
- asp.net获取客户端浏览器及主机信息
- c++ Lambda 表达式介绍
- QT中通过HTTP URL获取并保存网页上的图片
- ab-web压力测试
- 【OpenCV】通过鼠标在图像中绘制RotatedRect旋转矩形
- android Jsoup获取网站内容(实例为新闻标题获取) —android网络必学
- ThreadPoolExecutor使用和思考(上)-线程池大小设置与BlockingQueue的三种实现区别(总结)