Xn数列

题目描述:
给你6个数,m, a, c, x0, n, g
Xn+1 = ( aXn + c ) mod m,求Xn
m, a, c, x0, n, g<=10^18
输入描述:
一行六个数 m, a, c, x0, n, g
输出描述:
输出一个数 Xn mod g
样例输入:
11 8 7 1 5 3
样例输出:
2
数据范围及提示:
int64按位相乘可以不要用高精度。
思路:
暴力循环求解?NO~NO~NO~
如此大的数据,想到矩阵乘法,利用矩阵加速。
这道题的难度在于如何推出矩阵。
首先根据矩阵性质以及运算规则容易看出这是2*2的矩阵
让X0位于a[1][1]的位置。那么运算之后X1肯定也要位于a[1][1]的位置
因为X1=a*X0+c,所以a[1][2]的位置是c,a[2][1]和a[2][2]对于答案没有影响,所以设为0就可以了,至此,初始矩阵设置完毕。
那么初始矩阵乘以哪一个矩阵才能得到答案呢?重新定义一个矩阵b,容易看出,当b[1][1]=a,b[1][2]=0,b[2][1]=1,b[2][2]=1时,矩阵a*矩阵b才能得到我们想要的答案。

可以看出:
a*b可以得出X1,同样的X1*b得出X2,,即:X2=a*b*b,所以Xn=a*b^n。
因为数据太大,所以使用快速幂加速,long long会乘爆,所以使用慢速乘法。

#include<iostream>
#define lon long long
using namespace std;
lon m,a,c,x0,n,g,s[3][3],ans[3][3];
lon slow_mul(lon x,lon y,lon mod)//慢速乘法
{lon ans=0;while(y){if(y&1){y--;ans=(ans+x)%mod;}y>>=1;x=(x+x)%mod;}return ans;
}
void mul(lon p[3][3],lon q[3][3])//快速幂
{lon tmp[3][3]={0};for(int i=1;i<=2;i++)for(int j=1;j<=2;j++)for(int k=1;k<=2;k++)tmp[i][j]=(tmp[i][j]+slow_mul(p[i][k],q[k][j],m))%m;for(int i=1;i<=2;i++)for(int j=1;j<=2;j++)p[i][j]=tmp[i][j];
}
void quick_power(lon n)
{lon tmp[3][3];for(int i=1;i<=2;i++)for(int j=1;j<=2;j++)tmp[i][j]=s[i][j];while(n){if(n&1)mul(tmp,s);//因为初始值tmp为s,所以为n-1次幂 ,而不是n次幂。。。。 mul(s,s);n>>=1;}for(int i=1;i<=2;i++)for(int j=1;j<=2;j++)s[i][j]=tmp[i][j];
}
int main()
{cin>>m>>a>>c>>x0>>n>>g;ans[1][1]=x0,ans[1][2]=c,ans[2][1]=0,ans[2][2]=0;s[1][1]=a,s[1][2]=0,s[2][1]=1,s[2][2]=1;quick_power(n-1);//为什么是n-1次幂? lon tmp[3][3]={0};for(int i=1;i<=2;i++)for(int j=1;j<=2;j++)for(int k=1;k<=2;k++)tmp[i][j]=(tmp[i][j]+slow_mul(ans[i][k],s[k][j],m))%m;cout<<tmp[1][1]%g;//输出答案 return 0;
}

Xn数列(矩阵乘法+快速幂+慢速乘法)相关推荐

  1. 求解斐波那契第n项的几种解法(含矩阵乘法+快速幂) Python实现

    斐波那契数列 首先我们来定义一下斐波那契数列: f(n)={0n = 01n = 1f(n−1)+f(n−2)n > 1f(n)= \begin{cases} 0 & \text {n ...

  2. HDU 4565So Easy!2012长沙邀请赛A题(共轭构造+矩阵的快速幂)

    So Easy! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  3. 完全理解乘法快速幂及其两种写法的解析

    an=?0≤n≤10105an=?0≤n≤10105 a^n=? \qquad 0 \le n \le 10^{10^5} 没错,乘法快速幂就是解决上述问题的. 乘法快速幂的思想 可以看到,要求一个数 ...

  4. ZCMU-1618-骨牌覆盖(矩阵乘法+快速幂)

    1618: 骨牌覆盖1 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 264  Solved: 124 [Submit][Status][Web Bo ...

  5. 【BZOJ 2323】 2323: [ZJOI2011]细胞 (DP+矩阵乘法+快速幂*)

    2323: [ZJOI2011]细胞 Description 2222年,人类在银河系外的某颗星球上发现了生命,并且携带了一个细胞回到了地球.经过反复研究,人类已经完全掌握了这类细胞的发展规律: 这种 ...

  6. [矩阵乘法/快速幂专题]Arc of Dream,Recursive sequence,233 Matrix,Training little cats

    矩阵快速幂习题 复习矩阵乘法及快速幂模板 乘法模板 快速幂模板 T1:Arc of Dream 题目 题解 code T2:Recursive sequence 题目 题解 code T3:233 M ...

  7. bzoj 4417: [Shoi2013]超级跳马(矩阵合并+快速幂)

    4417: [Shoi2013]超级跳马 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 410  Solved: 252 [Submit][Stat ...

  8. 数学--数论--快速乘法+快速幂

    1.快速幂(快速模幂) ①求a^b: int pow(int a, int k) { int ans = 1;while(k) {if(k &1) ans *= a; //判断奇偶只用判断最后 ...

  9. 循环矩阵的快速幂(bzoj 2510: 弱题)

    2510: 弱题 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 408  Solved: 218 [Submit][Status][Discuss] ...

最新文章

  1. 给你的博客添加个看电影的频道
  2. 经典SQL语句大全(提升篇)
  3. redis面试问题(二)
  4. 机架式服务器怎么和显示屏连接,图解机架式服务器的机箱和电源
  5. 怎么看python程序卡在哪里_Python程序卡住了
  6. B+树(加强版多路平衡查找树)
  7. 加载模型图_Tensorflow ckpt模型加载时的命名映射
  8. python 示例_带有示例的Python列表remove()方法
  9. 最大化窗口快捷键_计算机快捷键大全(最全篇)
  10. C#对Windows服务组的启动与停止
  11. vsftpd搭建及配置参数
  12. scala里集合排序函数的使用
  13. 困惑度 | NLP中对困惑度感到困惑?
  14. eclipse的下载及安装教程
  15. 网吧系统快速设置工具
  16. 高项 双代号时标网络图
  17. struct termios
  18. 计算机专业法语词汇,法语计算机及网络词汇(4)
  19. 【免费分享】论文查重软件(亲测好用!)
  20. 通过STC12C5A08S2实战项目来理解单片机是怎么工作的

热门文章

  1. 精彩回顾|2019决策易“绩效驱动,团队赋能”大会圆满落幕
  2. python1-n之间的素数输出_编程计算并输出1~n之间所有素数之和
  3. 算法代码备忘录(2)
  4. K8S学习笔记之Service和kube-proxy
  5. 荣耀10的android版本区别,荣耀10和荣耀V10哪个好?荣耀10与V10区别对比 (全文)
  6. 性能测试结果分析报告
  7. 编程学不进去?如何才能拯救你的编程能力?
  8. SAP客户端多语言设置
  9. Indy:Connection Closed Gracefully
  10. Java可变长参数列表