题目链接

  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)了。因而,用矩阵快速幂就能很快把问题解决了。

 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矩阵快速幂相关推荐

  1. HDU4686 Arc of Dream —— 矩阵快速幂

    题目链接:https://vjudge.net/problem/HDU-4686 Arc of Dream Time Limit: 2000/2000 MS (Java/Others)    Memo ...

  2. HDU - 4686 Arc of Dream(矩阵快速幂,水题)

    题目链接:点击查看 题目大意:给出定义: 现在依次给出n,A0,AX,AY,B0,BX,BY 求Aod的第n项对1e9+7取模后的结果 题目分析: 简单矩阵快速幂 首先化简一下: 初始矩阵:(取n=1 ...

  3. 矩阵快速幂+构造方法

    与快速幂一样,可以将递推式通过二进制的方式来进行优化,这个学了快速幂就是十分容易理解 大概的板子如下: struct mat///自己定义大小的矩阵 {ll m[11][11]; }; mat mul ...

  4. 【做题】SRM701 Div1 Hard - FibonacciStringSum——数学和式&矩阵快速幂

    原文链接 https://www.cnblogs.com/cly-none/p/SRM701Div1C.html 题意:定义"Fibonacci string"为没有连续1的01串 ...

  5. 快速幂 + 矩阵快速幂

    快速幂 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #define LL lo ...

  6. HDU4549(矩阵快速幂+快速幂)

    f(n)=a^f(n-1) + b^f(n-2):计算矩阵部分用矩阵快速幂:计算a的幂次和b的幂次用快速幂. #include<iostream> #include<algorith ...

  7. [HNOI2008]GT考试[矩阵快速幂+kmp优化的dp]

    解题思路:假如说我们用f[i]表示长度为i的串能组合成无不吉利数字的组合的个数的话我们无法找到f[i]和f[i+1]的关系,就是我们下一位填某个数字会不会出现不吉利串,这就和你前面的串末尾于不吉利串重 ...

  8. I-Matrix Power Series POJ - 3233 矩阵快速幂+分治

    I-Matrix Power Series POJ - 3233 矩阵快速幂+分治 Problem Description Given a n × n matrix A and a positive ...

  9. H - Fibonacci POJ - 3070 (矩阵快速幂)

    H - Fibonacci POJ - 3070 (矩阵快速幂) Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and ...

最新文章

  1. 插入排序法算长度为10的数组
  2. PHP面试题:PHP加速模式/扩展? PHP调试模式/工具?
  3. 聚焦 | 数据湖分析如何面向对象存储OSS进行优化?
  4. OpenMMLab的新篇章
  5. cocos2d之列表容器节点再排序
  6. 计算机字体对于现代设计有何意义,字体设计课程计算机授课方式的探索.doc
  7. 基于stm32的银行排队叫号机设计
  8. 编译疑问: Warning: Backslash and Newline separated by space
  9. 数据结构 WSADATA
  10. python 解析excel模板_python 解析Excel
  11. php多线程采集,php浏览器模拟:用于多线程处理的curl_multi一族函数使用介绍
  12. 当有人推荐你读什么书时你是属于哪一种
  13. IC、FPGA验证学习
  14. WIN7笔记本 用户账户登录密码忘记/错误解决方法
  15. uni-app -- 改变页面背景颜色
  16. DeepCTR DeepMatch简单实用指南
  17. 002__Hive的tez引擎的配置步骤
  18. java毕业设计汽车商城系统mybatis+源码+调试部署+系统+数据库+lw
  19. cocos2dx内存优化
  20. airtest+poco多脚本、多设备批处理运行测试用例自动生成测试报告

热门文章

  1. 操作系统—内存的基础知识
  2. 有向图的强连通分量--Tarjan算法---代码分析
  3. LL(1)文法与其对应的FOLLOW,SELECT和FIRST集
  4. 2018蓝桥C++B:煤球数目;生日蜡烛(枚举年龄和枚举次数)
  5. Wannafly模拟赛2: A. Contest(Cdq分治)
  6. bzoj 1603: [Usaco2008 Oct]打谷机(拆点并查集)
  7. opencv 物体形状匹配
  8. grafana设置mysql为数据源,并进行可视化
  9. elk日志系统中elasticsearch 索引read only 解决
  10. C语言程序设计I—第五周教学