zoukankan      html  css  js  c++  java
  • 【u021】广义斐波那契数列

    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[n]);//最后直接输出答案。
    	return 0;
    }


    
  • 相关阅读:
    8.ps输出属性-----状态
    洛谷P1057 传球游戏
    动态规划
    洛谷P1192 台阶问题
    最大公约数和最小公倍数
    C++ memcpy()函数用法
    next_permutation(a,a+n)
    std::ios::sync_with_stdio(false);
    让计算机很快地求出a^b%c;
    洛谷P1433 吃奶酪
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632286.html
Copyright © 2011-2022 走看看