- 题目描述:
-
给定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
- 经典代码:
#include <iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int a0,a1,p,q,k;
struct rec
{
int a[2][2];
};
rec f(rec aa,rec bb)
{
rec ret;
ret.a[0][0]=(aa.a[0][0]*bb.a[0][0]+aa.a[0][1]*bb.a[1][0])%10000;
ret.a[0][1]=(aa.a[0][0]*bb.a[0][1]+aa.a[0][1]*bb.a[1][1])%10000;
ret.a[1][0]=(aa.a[1][0]*bb.a[0][0]+aa.a[1][1]*bb.a[1][0])%10000;
ret.a[1][1]=(aa.a[1][0]*bb.a[0][1]+aa.a[1][1]*bb.a[1][1])%10000;
return ret;
}
rec mul(rec aa,int kk)
{
rec ret;
ret.a[0][0]=1;ret.a[0][1]=0;ret.a[1][0]=0;ret.a[1][1]=1;
for(;kk;kk>>=1)
{
if(kk&1)ret=f(ret,aa);
aa=f(aa,aa);
}
return ret;
}
int main()
{
while(~scanf("%d%d%d%d%d",&a0,&a1,&p,&q,&k))
{
if(k==0){printf("%d ",a0);continue;}
else if(k==1){printf("%d ",a1);continue;}
rec x;
x.a[0][0]=p;x.a[0][1]=1;x.a[1][0]=q;x.a[1][1]=0;
rec ans=mul(x,k-1);
printf("%d ",(a1*ans.a[0][0]+a0*ans.a[1][0])%10000);
}
return 0;
}