HDU4686——Arc of Dream矩阵快速幂
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4686
题目大意:
已知a0=A0, ai=Ax*ai-1+Ay;
b0=B0, bi=Bx*bi-1+By;
求∑ai*bi(i=0-->n-1)。
n不超过1018,A0,Ax,Ay,B0,Bx,BY不超过2*109。
题目分析:
因为n很大,不可能用递推来做,这个时候就想到了矩阵的方法。构造了好几个满足要求的,但都是仅仅满足ai或者bi的,最后才发现,把ai*bi按递推式展开,
ai*bi=Ax*By*ai-1*bi-1+Ax*By*ai-1+Ay*Bx*bi-1+By*Ay。将常数组合在一起构成一个矩阵,将变量组合在一起构成另一个矩阵,然后将ai*bi构造成矩阵递推式:
矩阵1:
1 ai bi ai*bi si(求和)
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
矩阵2:
1 Ay By Ay*By Ay*By
0 Ax 0 Ax*By Ax*By
0 0 Bx Ay*Bx Ay*Bx
0 0 0 Ax*By Ax*By
0 0 0 0 1
矩阵3
1 ai+1 bi+1 ai+1*bi+1 si(求和)
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
显然 矩阵1*矩阵2=矩阵3。根据递推关系呢,矩阵1(i=0)*(矩阵2)n-1就能得到s(n-1)了。因而,用矩阵快速幂就能很快把问题解决了。
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const long long mod=1000000007; 6 typedef struct 7 { 8 long long m[5][5]; 9 }mat; 10 mat X,Y; 11 mat multi(mat x,mat y) 12 { 13 mat temp; 14 for(int i=0;i<5;i++) 15 for(int j=0;j<5;j++) 16 { 17 temp.m[i][j]=0; 18 for(int k=0;k<5;k++) 19 temp.m[i][j]+=x.m[i][k]*y.m[k][j]%mod; 20 temp.m[i][j]%=mod; 21 } 22 return temp; 23 } 24 25 mat pow(long long k)//矩阵快速幂 26 { 27 mat ans=X,p=Y; 28 while(k) 29 { 30 if(k&1) 31 ans=multi(ans,p); 32 p=multi(p,p); 33 k/=2; 34 } 35 return ans; 36 } 37 38 int main() 39 { 40 long long n,a0,ax,ay,b0,bx,by; 41 while(cin>>n>>a0>>ax>>ay>>b0>>bx>>by) 42 { 43 if(!n)//这边需要注意特判一下 44 { 45 printf("0\n"); 46 continue; 47 } 48 memset(X.m,0,sizeof(X.m)); 49 memset(Y.m,0,sizeof(Y.m)); 50 X.m[0][0]=1;X.m[0][1]=a0;X.m[0][2]=b0;X.m[0][3]=a0*b0%mod;X.m[0][4]=a0*b0%mod; 51 Y.m[0][0]=1;Y.m[0][1]=ay;Y.m[0][2]=by;Y.m[0][3]=ay*by%mod;Y.m[0][4]=ay*by%mod; 52 Y.m[1][1]=ax;Y.m[1][3]=Y.m[1][4]=ax*by%mod; 53 Y.m[2][2]=bx;Y.m[2][3]=Y.m[2][4]=ay*bx%mod; 54 Y.m[3][3]=Y.m[3][4]=ax*bx%mod; 55 Y.m[4][4]=1; 56 mat ans=pow(n-1); 57 long long s=ans.m[0][4]%mod; 58 cout<<s<<endl; 59 } 60 return 0; 61 }
HDU4686
转载于:https://www.cnblogs.com/xiaozhuyang/p/HDU4686-ArcofDream.html
HDU4686——Arc of Dream矩阵快速幂相关推荐
- HDU4686 Arc of Dream —— 矩阵快速幂
题目链接:https://vjudge.net/problem/HDU-4686 Arc of Dream Time Limit: 2000/2000 MS (Java/Others) Memo ...
- HDU - 4686 Arc of Dream(矩阵快速幂,水题)
题目链接:点击查看 题目大意:给出定义: 现在依次给出n,A0,AX,AY,B0,BX,BY 求Aod的第n项对1e9+7取模后的结果 题目分析: 简单矩阵快速幂 首先化简一下: 初始矩阵:(取n=1 ...
- 矩阵快速幂+构造方法
与快速幂一样,可以将递推式通过二进制的方式来进行优化,这个学了快速幂就是十分容易理解 大概的板子如下: struct mat///自己定义大小的矩阵 {ll m[11][11]; }; mat mul ...
- 【做题】SRM701 Div1 Hard - FibonacciStringSum——数学和式&矩阵快速幂
原文链接 https://www.cnblogs.com/cly-none/p/SRM701Div1C.html 题意:定义"Fibonacci string"为没有连续1的01串 ...
- 快速幂 + 矩阵快速幂
快速幂 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #define LL lo ...
- HDU4549(矩阵快速幂+快速幂)
f(n)=a^f(n-1) + b^f(n-2):计算矩阵部分用矩阵快速幂:计算a的幂次和b的幂次用快速幂. #include<iostream> #include<algorith ...
- [HNOI2008]GT考试[矩阵快速幂+kmp优化的dp]
解题思路:假如说我们用f[i]表示长度为i的串能组合成无不吉利数字的组合的个数的话我们无法找到f[i]和f[i+1]的关系,就是我们下一位填某个数字会不会出现不吉利串,这就和你前面的串末尾于不吉利串重 ...
- I-Matrix Power Series POJ - 3233 矩阵快速幂+分治
I-Matrix Power Series POJ - 3233 矩阵快速幂+分治 Problem Description Given a n × n matrix A and a positive ...
- H - Fibonacci POJ - 3070 (矩阵快速幂)
H - Fibonacci POJ - 3070 (矩阵快速幂) Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and ...
最新文章
- 插入排序法算长度为10的数组
- PHP面试题:PHP加速模式/扩展? PHP调试模式/工具?
- 聚焦 | 数据湖分析如何面向对象存储OSS进行优化?
- OpenMMLab的新篇章
- cocos2d之列表容器节点再排序
- 计算机字体对于现代设计有何意义,字体设计课程计算机授课方式的探索.doc
- 基于stm32的银行排队叫号机设计
- 编译疑问: Warning: Backslash and Newline separated by space
- 数据结构 WSADATA
- python 解析excel模板_python 解析Excel
- php多线程采集,php浏览器模拟:用于多线程处理的curl_multi一族函数使用介绍
- 当有人推荐你读什么书时你是属于哪一种
- IC、FPGA验证学习
- WIN7笔记本 用户账户登录密码忘记/错误解决方法
- uni-app -- 改变页面背景颜色
- DeepCTR DeepMatch简单实用指南
- 002__Hive的tez引擎的配置步骤
- java毕业设计汽车商城系统mybatis+源码+调试部署+系统+数据库+lw
- cocos2dx内存优化
- airtest+poco多脚本、多设备批处理运行测试用例自动生成测试报告
热门文章
- 操作系统—内存的基础知识
- 有向图的强连通分量--Tarjan算法---代码分析
- LL(1)文法与其对应的FOLLOW,SELECT和FIRST集
- 2018蓝桥C++B:煤球数目;生日蜡烛(枚举年龄和枚举次数)
- Wannafly模拟赛2: A. Contest(Cdq分治)
- bzoj 1603: [Usaco2008 Oct]打谷机(拆点并查集)
- opencv 物体形状匹配
- grafana设置mysql为数据源,并进行可视化
- elk日志系统中elasticsearch 索引read only 解决
- C语言程序设计I—第五周教学