1574 广义斐波那契数列

时间限制: 1 s

空间限制: 256000 KB

题目等级 : 钻石 Diamond

题目描述 Description

广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列。今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an除以m的余数。

输入描述 Input Description

输入包含一行6个整数。依次是p,q,a1,a2,n,m,其中在p,q,a1,a2整数范围内,n和m在长整数范围内。

输出描述 Output Description

输出包含一行一个整数,即an除以m的余数。

样例输入 Sample Input

1 1 1 1 10 7

样例输出 Sample Output

6

数据范围及提示 Data Size & Hint

数列第10项是55,除以7的余数为6。

分类标签 Tags

矩阵乘法 数论

/*
矩阵乘法快速幂.
矩阵还是比较好推的.....
要时刻想清楚最后的答案记在哪儿.
然后W了好几次.
ans先赋值乘一次.n-1.
把答案放在后边的话A1到An显然乘了n-2次....
*/
#include<iostream>
#include<cstdio>
#define MAXN 3
#define LL long long
using namespace std;
LL p,q,a1,a2,n,m;
LL a[MAXN][MAXN],ans[MAXN][MAXN],c[MAXN][MAXN],b[MAXN][MAXN];
void mi(int n)
{
while(n)
{
if(n&1)
{
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
c[i][j]=(c[i][j]+ans[i][k]*b[k][j]%m)%m;
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
ans[i][j]=c[i][j],c[i][j]=0;
}
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
c[i][j]=(c[i][j]+b[i][k]*b[k][j]%m)%m;
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
b[i][j]=c[i][j],c[i][j]=0;
n>>=1;
}
}
void slove()
{
a[1][1]=a1,a[1][2]=a2;
b[1][2]=ans[1][2]=q,b[2][1]=ans[2][1]=1,
b[2][2]=ans[2][2]=p;
mi(n);
printf("%lld",(a[1][1]*ans[1][2]%m+a[1][2]*ans[2][2]%m)%m);
}
int main()
{
scanf("%d%d%d%d",&p,&q,&a1,&a2);
cin>>n;cin>>m;
n-=3;
slove();
return 0;
}
/*
结果在前边.
多乘一次.
*/
#include<iostream>
#include<cstdio>
#define MAXN 3
#define LL long long
using namespace std;
LL p,q,a1,a2,n,m;
LL a[MAXN][MAXN],ans[MAXN][MAXN],c[MAXN][MAXN],b[MAXN][MAXN];
void mi(int n)
{
while(n)
{
if(n&1)
{
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
c[i][j]=(c[i][j]+ans[i][k]*b[k][j]%m)%m;
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
ans[i][j]=c[i][j],c[i][j]=0;
}
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
c[i][j]=(c[i][j]+b[i][k]*b[k][j]%m)%m;
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
b[i][j]=c[i][j],c[i][j]=0;
n>>=1;
}
/*for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
c[i][j]=(c[i][j]+a[i][k]*ans[k][j]%m)%m;*/
}
void slove()
{
a[1][1]=a1,a[1][2]=a2;
b[1][2]=ans[1][2]=q,b[2][1]=ans[2][1]=1,
b[2][2]=ans[2][2]=p;
mi(n);
printf("%lld",(a[1][1]*ans[1][1]%m+a[1][2]*ans[2][1]%m)%m);
}
int main()
{
scanf("%d%d%d%d",&p,&q,&a1,&a2);
cin>>n;cin>>m;
n-=2;
slove();
return 0;
}

最新文章

  1. MVC的增删改和Razor
  2. 解决android:theme=&quot;@android:style/Theme.NoDisplay&quot; 加入这句话后程序不能运行
  3. HW2.17
  4. 如何让用户在用webview访问网页时嵌入我们自己的内容
  5. Spring配置与第一Spring HelloWorld
  6. 配置LAMP实现WordPress
  7. python入门:python包管理工具pip的安装
  8. git忽略文件不起作用时
  9. 关于PHP上传文件时配置 php.ini 中的 upload_tmp_dir
  10. 第26月第22天 iOS瘦身之armv7 armv7s arm64选用 iOS crash
  11. 【原创】py3+requests+json+xlwt,爬取拉勾招聘信息
  12. suoi37 清点更多船只 (卡空间线段树)
  13. ::before 伪元素三角
  14. 学习推荐-Postgresql学习手册
  15. PHP 接收筛选项包含0的select下拉菜单的处理
  16. Redis学习第八课:Redis高级实用特性(二)
  17. Phaser3跟随自定义路径移动的赛车 -- iFIERO游戏教程
  18. serial minicom
  19. 完美解决github访问速度慢[转]
  20. springboot pom 详解

热门文章

  1. Python3 + selenium + Chrome浏览器(webdriver.Chrome()报错)
  2. [javascript]localStorage和sessionStorage区别
  3. C++通用框架和库
  4. javaIO——CharArrayReader &amp; CharArrayWriter
  5. arcgis js之调用wms服务
  6. 垃圾分类,javascript和python
  7. NET如何使用ELinq-实现增删改查
  8. PLSQL导入导出数据库
  9. CUDA中使用多维数组
  10. 网页接入dingding扫码登录