戴璞微的博客

简单点!做事的动机简单点

历届试题 斐波那契

问题描述
  斐波那契数列大家都非常熟悉。它的定义是:

  f(x) = 1 …. (x=1,2)
  f(x) = f(x-1) + f(x-2) …. (x>2)

  对于给定的整数 n 和 m,我们希望求出:
  f(1) + f(2) + … + f(n) 的值。但这个值可能非常大,所以我们把它对 f(m) 取模。
  公式如下

  但这个数字依然很大,所以需要再对 p 求模。
输入格式
  输入为一行用空格分开的整数 n m p (0 < n, m, p < 10^18)
输出格式
  输出为1个整数,表示答案
样例输入
2 3 5
样例输出
0
样例输入
15 11 29
样例输出
25


代码如下:

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    static int MAX = Integer.MAX_VALUE;
    static ArrayList<BigInteger> f = new ArrayList<BigInteger>();
    static ArrayList<BigInteger> sum = new ArrayList<BigInteger>();

    public static BigInteger Factor(int i){
        BigInteger known;
        if ( i < f.size()){
            return f.get(i);
        }
        known = f.get(i-1).add(f.get(i-2));
        f.add(known);
        return known;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        f.add(BigInteger.ONE);
        f.add(BigInteger.ONE);
        sum.add(BigInteger.ONE);
        sum.add(new BigInteger("2"));
        int n = in.nextInt();
        int m = in.nextInt();
        BigInteger p = new BigInteger(in.next());
        int max = Math.max(n, m);
        int start = f.size();
        for ( int i = start ; i < max ; i++){
            BigInteger fab = Factor(i);
            BigInteger s = sum.get(i-1).add(fab);
            sum.add(s);
        }
        BigInteger result = sum.get(n-1).remainder(f.get(m-1));     
        result = result.remainder(p);
        System.out.print(result.toString());

        in.close();
    }
}
阅读更多
版权声明:本文为博主原创文章,若需转载,请注明http://blog.csdn.net/qq_30091945 https://blog.csdn.net/qq_30091945/article/details/60469898
文章标签: 蓝桥杯 Java
个人分类: 蓝桥杯
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

历届试题 斐波那契

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭