Requêtes pour la différence maximale et minimale entre les nombres de Fibonacci dans des plages données

import java.util.*;

import java.lang.*;

class GFG{

    

static final int MAX = 100005;

  

static boolean isFib[] = new boolean[MAX];

static int[] prefix = new int[MAX],

             suffix = new int[MAX];

  

static void precompute()

{

    

    

    

  

    

    

    int prev = 0, curr = 1;

    isFib[prev] = isFib[curr] = true;

  

    

    

    while (curr + prev < MAX)

    {

        int temp = curr + prev;

        isFib[temp] = true;

        prev = curr;

        curr = temp;

    }

  

    préfixe[1] = 1;

    suffixe[MAX - 1] = (int)1e9 + 7;

  

    

    for(int i = 2; i < MAX; i++)

    {

        

        

        

        

        if (isFib[i])

            prefix[i] = i;

        else

            préfixe[i] = préfixe[i - 1];

    }

  

    

    for(int i = MAX - 2; i > 1; i--)

    {

        if (isFib[i])

            suffix[i] = i;

        else

            suffixe[i] = suffixe[i + 1];

    }

}

  

static int query(int L, int R)

{

    if (prefix[R] < L || suffix[L] > R)

        return 0;

    else

        return prefix[R] - suffix[L];

}

  

static int minDifference(int L, int R)

{

    

    

    

    int fst = 0;

  

    for(int i = L; i <= R; i++)

    {

        if (isFib[i])

        {

            fst = i;

            break;

        }

    }

  

    

    

    int snd = 0;

    for(int i = fst + 1; i <= R; i++)

    {

        if (isFib[i])

        {

            snd = i;

            break;

        }

    }

  

    

    

    if (snd == 0)

        return -1;

  

    

    

    

    int diff = snd - fst;

  

    

    

    int left = snd + 1;

    int right = R;

  

    

    for(int i = left; i <= right; i++)

    {

        

        

        if (isFib[i])

        {

            

            

            

            if (i - snd <= diff)

            {

                fst = snd;

                snd = i;

                diff = snd - fst;

            }

        }

    }

    return diff;

}

  

static void findAns(int arr[][], int q)

{

    precompute();

    

    

    for(int i = 0; i < q; i++)

    {

       System.out.println("Maximum Difference: " +

                    requête (arr[i][0]arr[i][1]));

            

  

       System.out.println("Minimum Difference: " +

            minDifférence(arr[i][0]arr[i][1]));

    }

}

public static void main(String[] args)

{

    int q = 1;

    

    int arr[][] = { { 21, 100 } };

    

    findAns(arr, q);

}

}

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Aller en haut