递推数列 矩阵法

题目描述:

给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q。这里n >= 2。 求第k个数对10000的模。

输入:

输入包括5个整数:a0、a1、p、q、k。

输出:

第k个数a(k)对10000的模。

样例输入:
20 1 1 14 5
样例输出:
8359
p q 矩阵二维!用一维数组实现  三维则更多

#include "stdio.h" #include "stdlib.h" #include"string.h" #include "algorithm" void mul(__int64 *a,__int64 b) { __int64 t[4],t2[4],a2[4];int i; for(i=0;i<4;i++) { t[i]=a[i]; } b--;//求a的b次幂,本身有一次 while(b) { if(b&1)//把乘方改为按位进行乘法 { a2[0]=a[0]*t[0]+a[1]*t[2]; a2[1]=a[0]*t[1]+a[1]*t[3]; a2[2]=a[2]*t[0]+a[3]*t[2]; a2[3]=a[2]*t[1]+a[3]*t[3]; for(i=0;i<4;i++) {a[i]=a2[i];a[i]%=10000;} } t2[0]=t[0]*t[0]+t[1]*t[2]; t2[1]=t[0]*t[1]+t[1]*t[3]; t2[2]=t[2]*t[0]+t[3]*t[2]; t2[3]=t[2]*t[1]+t[3]*t[3]; for(i=0;i<4;i++) {t[i]=t2[i];t[i]%=10000;} b>>=1; } } int main() { __int64 i,j,k,a0,a1,p,q,a2,temp; __int64 a[4],b[4],c[5]; while(scanf("%I64d %I64d %I64d %I64d %I64d",&a0,&a1,&p,&q,&k)!=EOF) { a[0]=0;a[1]=1;a[2]=q;a[2]%=10000;a[3]=p;a[3]%=10000; if(k>1) mul(a,k-1);//k-1次幂的矩阵乘以初始化值 temp=a[2]*a0+a[3]*a1;temp%=10000; if(k==0) temp=a0; if(k==1) temp=a1; printf("%I64d\n",temp); } return 0; }

 

转载于:https://www.cnblogs.com/huashiyiqike/articles/2859900.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值