-
题目描述:
-
给定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
运用矩阵乘法,由题意可知:
[a(n) ] = [p q] * [a(n-1)]
[a(n-1)] [1 0] [a(n-2)]
即
[a(n) ] = [p q] ^ (n-1) * [a(1)]
[a(n-1)] [1 0] [a(0)]
用快速幂算法求矩阵的n-1次幂
代码如下:
#include <stdio.h>
#define MOD_NUM 10000
int main(void)
{
int a, b, p, q, r, s, t, k;
int t0, t1, t2, t3;
while (scanf("%d %d %d %d %d", &a, &b, &p, &q, &k) != EOF)
{
a %= MOD_NUM;
b %= MOD_NUM;
p %= MOD_NUM;
q %= MOD_NUM;
r = 1;
s = 0;
while (k > 0)
{
if (k & 1 != 0)
{
t = a;
a = (r * b + s * t) % MOD_NUM;
b = (p * b + q * t) % MOD_NUM;
}
t0 = p;
t1 = q;
t2 = r;
t3 = s;
p = (t0 * t0 + t1 * t2) % MOD_NUM;
q = t1 * (t0 + t3) % MOD_NUM;
r = t2 * (t0 + t3) % MOD_NUM;
s = (t2 * t1 + t3 * t3) % MOD_NUM;
k >>= 1;
}
printf("%d\n", a);
}
return 0;
}