您的位置:首页 > 其它

题目1081:递推数列

2017-02-07 13:25 274 查看
题目描述:

给定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<stdio.h>
#define BIG 10000
/*
int main() {
int a0, a1, p, q, k;
while (scanf("%d%d%d%d%d", &a0, &a1, &p, &q, &k) != EOF) {
int pre1 = a1;
int pre2 = a0;
int cur = 0;
for (int i = 2; i <= k; i++) {
cur = ((p * pre1) % BIG + (q *
4000
pre2) % BIG) % BIG;
pre2 = pre1;
pre1 = cur;
}
printf("%d\n", cur);

}
return 0;
}
*/
struct Matrix {
int a, b, c, d;
};
Matrix mul(Matrix m, Matrix n) {
Matrix res;
res.a = (m.a * n.a + m.b * n.c) % BIG;
res.b = (m.a * n.b + m.b * n.d) % BIG;
res.c = (m.c * n.a + m.d * n.c) % BIG;
res.d = (m.c * n.b + m.d * n.d) % BIG;
return res;
}
Matrix pow(Matrix m, int k) {
Matrix res;
res.a = res.d = 1;
res.b = res.c = 0;
while (k > 0) {
if (k & 1 == 1)
res = mul(res, m);
m = mul(m, m);
k = k >> 1;
}
return res;
}

int main() {
int a0, a1, p, q, k;
Matrix m;
while (scanf("%d%d%d%d%d", &a0, &a1, &m.a, &m.b, &k) != EOF) {
m.c = 1;
m.d = 0;
if (k == 0)
printf("%d\n", a0);
else if (k == 1)
printf("%d\n", a1);
else {
k--;
Matrix res = pow(m, k);
printf("%d\n", (res.a * a1 + res.b * a0) % BIG);
}
}
return 0;
}


题目链接:
http://ac.jobdu.com/problem.php?pid=1081 参考链接:
http://m.blog.csdn.net/article/details?id=12560065
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: