Fork me on GitHub

题目描述:

给定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; }

 

posted on 2013-01-14 16:20  huashiyiqike  阅读(339)  评论(0编辑  收藏  举报