题目3 : Fibonacci

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

Given a sequence {an}, how many non-empty sub-sequence of it is a prefix of fibonacci sequence.

A sub-sequence is a sequence that can be derived from another sequence by deleting some elements without changing the order of the remaining elements.

The fibonacci sequence is defined as below:

F1 = 1, F2 = 1

Fn = Fn-1 + Fn-2, n>=3

输入

One line with an integer n.

Second line with n integers, indicating the sequence {an}.

For 30% of the data, n<=10.

For 60% of the data, n<=1000.

For 100% of the data, n<=1000000, 0<=ai<=100000.

输出

One line with an integer, indicating the answer modulo 1,000,000,007.

样例提示

The 7 sub-sequences are:

{a2}

{a3}

{a2, a3}

{a2, a3, a4}

{a2, a3, a5}

{a2, a3, a4, a6}

{a2, a3, a5, a6}

样例输入
6
2 1 1 2 2 3
样例输出
7

EmacsNormalVim

// Java版本
import java.awt.im.InputContext;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Scanner;

public class Main {
/*

2
0 0
0 3

1.000 1.000 5.000

 */
    static HashSet<Integer> fibSet=new HashSet<Integer>();
    static    HashMap<Integer, Integer>  fibMap=new HashMap<Integer, Integer>();
    static    HashMap<Integer, Integer>  fibMap2=new HashMap<Integer, Integer>();
    public static void fib(){
        fibMap.put(1, (int) 1);
        fibMap.put(2, (int) 1);
        fibSet.add((int) 1);
        fibMap2.put((int) 1, 1);
        for(int i=3; i<50; i++){

            fibMap.put(i, fibMap.get(i-1)+fibMap.get(i-2));
            fibMap2.put(fibMap.get(i-1)+fibMap.get(i-2), i);
            fibSet.add(fibMap.get(i-1)+fibMap.get(i-2));
        }
        //System.out.println("fibmap");

    }
    //如果有a之前的所有
    public  static boolean hasPre(int a, HashMap<Integer, Integer> nums){
        int k=fibMap2.get(a);

        boolean result=true;
        for(int i=k-1;i>2; i--){

            if(nums.get(fibMap.get(i)) !=null  &&nums.get(fibMap.get(i)) >0){
                continue;
            }else{
                result=false;
                break;
            }
        }

        if(result&& nums.get(1)!=null &&nums.get(1)>1 ){
            result= true;
        }else{
            result= false;
        }

        return result;

    }

    public static int precount(int a, HashMap<Integer, Integer> nums){
        long count=1;
        int k=fibMap2.get(a);

        for(int i=k-1;i>2; i--){
            count=count*nums.get(fibMap.get(i));

        }
        count*=(nums.get(1)*(nums.get(1)-1)/2);
        return (int) (count%1000000007);

    }
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        int n=scanner.nextInt();
        int a[] = new int[n];
        for(int i=0; i<n; i++){
            a[i]=scanner.nextInt();

        }
        fib();
        //fib计数
        HashMap<Integer, Integer>  nums=new HashMap<Integer, Integer>();
        boolean has1=false;
        long count=0;
        for(int i=0; i<n; ++i){
            //如果等于1,那就好弄
            //System.out.println(a[i]+""+fibSet.contains((long)a[i]) );
            if(a[i]==1){
                if(nums.containsKey(1)){
                    count=count+nums.get(1)+1;
                    nums.put(1, nums.get(1)+1);

                }else{
                    nums.put(1, 1);
                    count+=1;
                }
                has1=true;

            }else if(has1&& nums.get(1)>1&& fibSet.contains(a[i]) && hasPre(a[i],nums)){

                count=(count+precount(a[i],nums))%1000000007;
                if(nums.containsKey(a[i])){
                    nums.put(a[i], nums.get(a[i])+1);
                }else{
                    nums.put(a[i],  1);
                }

            }
            //System.out.println(nums);
        }

        System.out.println(count);
        scanner.close();
    }

}
时间: 2024-10-12 17:30:33

题目3 : Fibonacci的相关文章

HDU - 1848 - Fibonacci again and again

先上题目: Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4964    Accepted Submission(s): 2072 Problem Description 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的:F(1)=1;F

USTC OJ — 1003 Fibonacci Numbers(组合数学, 简单题)

1. 题目描述 Fibonacci数列定义为: A0 = 0, A1 = 1; An = An-1 + An-2, if n >= 2. 问题:输入一个n( 0 ≤ n ≤ 40 ),计算An. 2. 算法设计 直接利用公式计算即可,时间复杂度O(N),由于数据规模很小,可以选择 先打表,然后对每一个测试数据n,直接输出An: 或者分别对每一个n,计算An. 3. AC Code 1 #include <stdio.h> 2 #define N 41 3 int f[N]; 4 void

hdu4099 Revenge of Fibonacci

题意:给定fibonacci数列,输入前缀,求出下标.题目中fibonacci数量达到100000,而题目输入的前缀顶多为40位数字,这说明我们只需要精确计算fibinacci数前40位即可.查询时使用字典树.在计算时,为了保证前40位精确无误.在此我计算了前60位.以保证前面不在进位. 注意点: 1)关于表示进位问题,需要控制计算的数位数在60以内,切记计算时不要错位(相同位要对齐). 2)坑点:题目给出的数插入字典树最好插入前40位即可,否则MLE. 3)坑点:题目只要求计算下标不超过100

网易-Fibonacci数列

题目: Fibonacci数列是这样定义的:F[0] = 0F[1] = 1for each i ≥ 2: F[i] = F[i-1] + F[i-2]因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数.给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数. 输入描述: 输入为一个正整数N(1

(hdu step 2.2.1)Fibonacci(求当n很大时的斐波那契数)

题目: Fibonacci Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3036 Accepted Submission(s): 1397   Problem Description 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列(f[0]=0,f[1]=1;f[i] =

Fibonacci数列(找规律)

题目描述 Fibonacci数列是这样定义的:F[0] = 0F[1] = 1for each i ≥ 2: F[i] = F[i-1] + F[i-2]因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数.给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数. 输入描述: 输入为一个正整数N(

[HDU2855]Fibonacci Check-up

题目:Fibonacci Check-up 链接: 分析: 1)二项式展开:$(x+1)^n = \sum^n_{k=0}{C^k_n * x^k}$ 2)Fibonacci数列可以写为:$ \left[ \begin{array}{cc} 0 & 1 \\ 1 & 1 \end{array} \right]^n$的左下角项. 3)构造矩阵. #include <iostream> #include <cstring> #include <cstdio>

算法设计与分析 1.2 不一样的fibonacci数列

★题目描述 fibonacci 数列的递推公式是F(n) = F(n-1) + F(n-2)(n >= 2 且 n 为整数). 将这个递推式改为F(n) = aF(n-1) + bF(n-2)(n >= 2 且 n 为整数)时得到的是怎样的数列. 注意,这里我们依然令 F(0)=F(1)=1. ★输入格式 输入第一行三个正整数 q, a, b. 接下来有 q 行,每行一个自然数 n. 对于50%的数据,1 <= q.n <= 1000. 对于80%的数据,1 <= q.n &

微软2016 9月笔试

全场梦游..考研狗好久没码题了已经跪了T T 被自己蠢哭 题目1 : Farthest Point 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 Given a circle on a two-dimentional plane. Output the integral point in or on the boundary of the circle which has the largest distance from the center. 输入 One li