http://ac.jobdu.com/problem.php?pid=1081
递归算法显然最直观,可是复杂度太高一遇大数就超时。所以这里是用矩阵二分乘的方法,具体思路可参见《数学知识积累》。代码如下:
#include <stdio.h>
#define MAX 1000000
#define MOD 10000
typedef struct matrix
{
int a[2][2];
void set(int k, int l, int m, int n)
{
a[0][0]=k;
a[0][1]=l;
a[1][0]=m;
a[1][1]=n;
}
}matrix;
matrix mul(matrix &x, matrix &y)
{
matrix ret;
ret.a[0][0]=(x.a[0][0]*y.a[0][0]+x.a[0][1]*y.a[1][0])%MOD;
ret.a[0][1]=(x.a[0][0]*y.a[0][1]+x.a[0][1]*y.a[1][1])%MOD;
ret.a[1][0]=(x.a[1][0]*y.a[1][1]+x.a[0][0]*y.a[1][0])%MOD;
ret.a[1][1]=(x.a[1][0]*y.a[0][1]+x.a[1][1]*y.a[1][1])%MOD;
return ret;
}
int main()
{
int a0,a1,p,q,k;
while (scanf("%d %d %d %d %d",&a0,&a1,&p,&q,&k)==5)
{
if (k<2)
{
printf("%d\n",k==0?a0:a1);
continue;
}
matrix x,d;
x.set(1,0,0,1);
d.set(p,q,1,0);
int n=k-1;
while (n>0)
{
if (n&1==1)
x=mul(x,d);
d=mul(d,d);
n=n>>1;
}
int ans=(x.a[0][0]*a1+x.a[0][1]*a0)%MOD;
printf("%d\n",ans);
}
return 0;
}