【u021】广义斐波那契数列
2017-10-06 19:23
330 查看
Time Limit: 1 second
Memory Limit: 128 MB
【问题描述】
广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列。今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an除以m的余数。【输入格式】
输入包含一行6个整数。依次是p,q,a1,a2,n,m,其中在p,q,a1,a2整数范围内,n和m在长整数范围内。
【输出格式】
输出包含一行一个整数,即an除以m的余数。
【数据规模】
Sample Input1
1 1 1 1 10 7
Sample Output1
6
【样例说明】
数列第10项是55,除以7的余数为6。【题解】 那个an到an-k的关系你可以代入一个k=1来验证。 然后ci,di都可以迭代出来。 c1=p; d1=q; 最后得到c29999和d2999. 这样我们可以不断的缩减n的规模。即如果30001就直接将f[30001]存在f[1]中。
【代码】
#include <cstdio> __int64 p, q, a1, a2, n, m; __int64 f[40000]; int main() { scanf("%I64d%I64d%I64d%I64d%I64d%I64d", &p, &q, &a1, &a2, &n, &m); //输入数据。直接输入64位的就可以了。 f[1] = a1 % m; f[2] = a2 % m; f[3] = (p*f[2] + q*f[1]) % m;//先推出f[1],f[2],f[3]。 __int64 c, d; c = p; d = q; for (int i = 2; i <= 29999; i++)//进行迭代 得出c29999和d29999 { __int64 tempc, tempd; tempc = (p*c + d)%m; tempd = (q*c) %m; c = tempc; d = tempd; } while (n > 30000)//根据得到的东西不断地缩减n的规模。 { n -= 30000; f[1] = (c*f[2] + d*f[1]) %m; f[2] = (c*f[3] + d*f[2]) % m;//可以看到f[1],f[2],f[3]之前都已经取得了 f[3] = (p*f[2] + q*f[1]) % m;//然后得到f[3]就可以了。 } for (int i = 4; i <= n; i++)//剩下的已经小于30000了。可以通过迭代直接得出。(不会超时了) f[i] = (p*f[i - 1] + q*f[i - 2]) % m; printf("%I64d", f );//最后直接输出答案。 return 0; }
相关文章推荐
- 洛谷1349 广义斐波那契数列 【矩阵乘法】
- 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]
- 1574 广义斐波那契数列
- Luogu P1349 广义斐波那契数列
- 【洛谷1349】广义斐波那契数列
- P1349 广义斐波那契数列
- 矩阵乘法快速幂 codevs 1574 广义斐波那契数列
- P1349 广义斐波那契数列
- 【洛谷1349】广义斐波那契数列
- 洛谷1349 广义斐波那契数列 【矩阵乘法】
- HDU 5451 广义斐波那契数列
- 【矩阵乘法】广义斐波那契数列
- P1349 广义斐波那契数列
- 斐波那契数列
- 斐波那契数列的递归算法
- Fibonacci(斐波那契)数列实现
- 算法之递归算法(斐波那契数列之美)(100级阶梯,1,2步,几种方法)
- 斐波那契数列算法——递归与非递归
- java实现斐波那契数列的3种方法
- 斐波那契(Fibonacci)数列的求法