📜  斐波那契数的平方和

📅  最后修改于: 2021-05-31 18:55:29             🧑  作者: Mango

给定一个正整数N。任务是找到所有斐波那契数的平方和,直至第N个斐波那契数。那是,

f02 + f12 + f22+.......+fn2 

where fi indicates i-th fibonacci number.

斐波那契数:对于所有i> = 2,f 0 = 0和f 1 = 1且f i = f i-1 + f i- 2。
例子:

Input: N = 3
Output: 6
Explanation: 0 + 1 + 1 + 4 = 6

Input: N = 6
Output: 104
Explanation: 0 + 1 + 1 + 4 + 9 + 25 + 64 = 104

方法1:找出直到N的所有斐波那契数,然后求和它们的平方。该方法将花费O(n)的时间复杂度。
以下是此方法的实现:

C++
// C++ Program to find sum of
// squares of Fibonacci numbers
#include 
using namespace std;
 
// Function to calculate sum of
// squares of Fibonacci numbers
int calculateSquareSum(int n)
{
    if (n <= 0)
        return 0;
 
    int fibo[n + 1];
    fibo[0] = 0, fibo[1] = 1;
 
    // Initialize result
    int sum = (fibo[0] * fibo[0]) + (fibo[1] * fibo[1]);
 
    // Add remaining terms
    for (int i = 2; i <= n; i++) {
        fibo[i] = fibo[i - 1] + fibo[i - 2];
        sum += (fibo[i] * fibo[i]);
    }
 
    return sum;
}
 
// Driver program to test above function
int main()
{
    int n = 6;
 
    cout << "Sum of squares of Fibonacci numbers is : "
         << calculateSquareSum(n) << endl;
 
    return 0;
}


Java
// Java Program to find sum of
// squares of Fibonacci numbers
   
public class Improve {
     
     // Function to calculate sum of
    // squares of Fibonacci numbers
    static int calculateSquareSum(int n)
    {
        if (n <= 0)
            return 0;
       
        int fibo[] = new int[n+1];
        fibo[0] = 0 ;
        fibo[1] = 1 ;
       
        // Initialize result
        int sum = (fibo[0] * fibo[0]) + (fibo[1] * fibo[1]);
       
        // Add remaining terms
        for (int i = 2; i <= n; i++) {
            fibo[i] = fibo[i - 1] + fibo[i - 2];
            sum += (fibo[i] * fibo[i]);
        }
       
        return sum;
    }
       
    // Driver code
    public static void main(String args[])
    {
           int n = 6;
           System.out.println("Sum of squares of Fibonacci numbers is : " +
                                calculateSquareSum(n));
           
    }
    // This Code is contributed by ANKITRAI1
}


Python3
# Python3 Program to find sum of
# squares of Fibonacci numbers
 
# Function to calculate sum of
# squares of Fibonacci numbers
def calculateSquareSum(n):
    fibo = [0] * (n + 1);
    if (n <= 0):
        return 0;
    fibo[0] = 0;
    fibo[1] = 1;
     
    # Initialize result
    sum = ((fibo[0] * fibo[0]) +
           (fibo[1] * fibo[1]));
     
    # Add remaining terms
    for i in range(2, n + 1):
        fibo[i] = (fibo[i - 1] +
                   fibo[i - 2]);
        sum += (fibo[i] * fibo[i]);
 
    return sum;
 
# Driver Code
n = 6;
 
print("Sum of squares of Fibonacci numbers is :",
                          calculateSquareSum(n));
 
# This Code is contributed by mits


C#
// C# Program to find sum of
// squares of Fibonacci numbers
  
using System;
public class Improve {
      
     // Function to calculate sum of
    // squares of Fibonacci numbers
    static int calculateSquareSum(int n)
    {
        if (n <= 0)
            return 0;
        
        int[] fibo = new int[n+1];
        fibo[0] = 0 ;
        fibo[1] = 1 ;
        
        // Initialize result
        int sum = (fibo[0] * fibo[0]) + (fibo[1] * fibo[1]);
        
        // Add remaining terms
        for (int i = 2; i <= n; i++) {
            fibo[i] = fibo[i - 1] + fibo[i - 2];
            sum += (fibo[i] * fibo[i]);
        }
        
        return sum;
    }
        
    // Driver code
    public static void Main()
    {
           int n = 6;
           Console.Write("Sum of squares of Fibonacci numbers is : " +
                                calculateSquareSum(n));
            
    }
     
}


PHP


Javascript


C++
// C++ Program to find sum of squares of
// Fibonacci numbers in O(Log n) time.
#include 
using namespace std;
const int MAX = 1000;
 
// Create an array for memoization
int f[MAX] = { 0 };
 
// Returns n'th Fibonacci number using table f[]
int fib(int n)
{
    // Base cases
    if (n == 0)
        return 0;
    if (n == 1 || n == 2)
        return (f[n] = 1);
 
    // If fib(n) is already computed
    if (f[n])
        return f[n];
 
    int k = (n & 1) ? (n + 1) / 2 : n / 2;
 
    // Applying above formula [Note value n&1 is 1
    // if n is odd, else 0].
    f[n] = (n & 1) ? (fib(k) * fib(k) + fib(k - 1) * fib(k - 1))
                   : (2 * fib(k - 1) + fib(k)) * fib(k);
 
    return f[n];
}
 
// Function to calculate sum of
// squares of Fibonacci numbers
int calculateSumOfSquares(int n)
{
    return fib(n) * fib(n + 1);
}
 
// Driver Code
int main()
{
    int n = 6;
 
    cout << "Sum of Squares of Fibonacci numbers is : "
         << calculateSumOfSquares(n) << endl;
 
    return 0;
}


Java
// Java Program to find sum of squares of
// Fibonacci numbers in O(Log n) time.
 
class gfg {
 
    static int[] f = new int[1000];
// Create an array for memoization
 
// Returns n'th Fibonacci number using table f[]
    public static int fib(int n) {
        // Base cases
        if (n == 0) {
            return 0;
        }
        if (n == 1 || n == 2) {
            return (f[n] = 1);
        }
 
        // If fib(n) is already computed
        if (f[n] > 0) {
            return f[n];
        }
 
        int k = ((n & 1) > 0) ? (n + 1) / 2 : n / 2;
 
        // Applying above formula [Note value n&1 is 1
        // if n is odd, else 0].
        f[n] = ((n & 1) > 0) ? (fib(k)
                * fib(k) + fib(k - 1) * fib(k - 1))
                : (2 * fib(k - 1) + fib(k)) * fib(k);
 
        return f[n];
    }
 
// Function to calculate sum of
// squares of Fibonacci numbers
    public static int calculateSumOfSquares(int n) {
        return fib(n) * fib(n + 1);
    }
}
 
// Driver Code
class geek {
 
    public static void main(String[] args) {
        gfg g = new gfg();
        int n = 6;
        System.out.println("Sum of Squares of Fibonacci numbers is : "
                + g.calculateSumOfSquares(n));
    }
 
}
// This code is contributed by PrinciRaj1992


Python3
# Python3 program to find sum of squares
# of Fibonacci numbers in O(Log n) time.
MAX = 1000
 
# Create an array for memoization
f = [0 for i in range(MAX)]
 
# Returns n'th Fibonacci number using
# table f[]
def fib(n):
     
    # Base cases
    if n == 0:
        return 0
    if n == 1 or n == 2:
        return 1
 
    # If fib(n) is already computed
    if f[n]:
        return f[n]
 
    if n & 1:
        k = (n + 1) // 2
    else:
        k = n // 2
 
    # Applying above formula[Note value
    # n & 1 is 1 if n is odd, else 0].
    if n & 1:
        f[n] = (fib(k) * fib(k) +
                fib(k - 1) * fib(k - 1))
    else:
        f[n] = ((2 * fib(k - 1) +
                     fib(k)) * fib(k))
    return f[n]
 
# Function to calculate sum of
# squares of Fibonacci numbers
def calculateSumOfSquares(n):
 
    return fib(n) * fib(n + 1)
 
# Driver Code
n = 6
print("Sum of Squares of "
      "Fibonacci numbers is :",
      calculateSumOfSquares(n))
 
# This code is contributed by Gaurav Kumar Tailor


C#
// C# Program to find sum of squares of
// Fibonacci numbers in O(Log n) time.
using System;
class gfg
{
 int []f = new int [1000];
  // Create an array for memoization
      
 // Returns n'th Fibonacci number using table f[] 
 public int fib(int n)
 {
    // Base cases
    if (n == 0)
        return 0;
    if (n == 1 || n == 2)
        return (f[n] = 1);
 
    // If fib(n) is already computed
    if (f[n]>0)
        return f[n];
 
    int k = ((n & 1)>0) ? (n + 1) / 2 : n / 2;
 
    // Applying above formula [Note value n&1 is 1
    // if n is odd, else 0].
    f[n] = ((n & 1)>0) ? (fib(k) * fib(k) + fib(k - 1) * fib(k - 1))
                : (2 * fib(k - 1) + fib(k)) * fib(k);
 
    return f[n];
 }
 
// Function to calculate sum of
// squares of Fibonacci numbers
public int calculateSumOfSquares(int n)
 {
    return fib(n) * fib(n + 1);
 }
}
 
// Driver Code
class geek
{
 public static int Main()
 {
    gfg g = new gfg();
    int n = 6;
    Console.WriteLine( "Sum of Squares of Fibonacci numbers is : {0}", g.calculateSumOfSquares(n));
    return 0;
 }
     
}


PHP


Javascript


输出:
Sum of squares of Fibonacci numbers is : 104

方法2:我们知道,对于第i个斐波那契数,

fi+1 = fi + fi-1  for all i>0

Or, fi = fi+1 - fi-1 for all i>0
Or, fi2 = fifi+1 - fi-1fi

因此,对于任何n> 0,我们都会看到,

该标识还满足n = 0(对于n = 0,f 0 2 = 0 = f 0 f 1 )。
因此,要找到总和,只需要找到f n和f n + 1即可。在O(log n)时间中找到f n 。请参考本文的方法5或方法6。
下面是上述方法的实现:

C++

// C++ Program to find sum of squares of
// Fibonacci numbers in O(Log n) time.
#include 
using namespace std;
const int MAX = 1000;
 
// Create an array for memoization
int f[MAX] = { 0 };
 
// Returns n'th Fibonacci number using table f[]
int fib(int n)
{
    // Base cases
    if (n == 0)
        return 0;
    if (n == 1 || n == 2)
        return (f[n] = 1);
 
    // If fib(n) is already computed
    if (f[n])
        return f[n];
 
    int k = (n & 1) ? (n + 1) / 2 : n / 2;
 
    // Applying above formula [Note value n&1 is 1
    // if n is odd, else 0].
    f[n] = (n & 1) ? (fib(k) * fib(k) + fib(k - 1) * fib(k - 1))
                   : (2 * fib(k - 1) + fib(k)) * fib(k);
 
    return f[n];
}
 
// Function to calculate sum of
// squares of Fibonacci numbers
int calculateSumOfSquares(int n)
{
    return fib(n) * fib(n + 1);
}
 
// Driver Code
int main()
{
    int n = 6;
 
    cout << "Sum of Squares of Fibonacci numbers is : "
         << calculateSumOfSquares(n) << endl;
 
    return 0;
}

Java

// Java Program to find sum of squares of
// Fibonacci numbers in O(Log n) time.
 
class gfg {
 
    static int[] f = new int[1000];
// Create an array for memoization
 
// Returns n'th Fibonacci number using table f[]
    public static int fib(int n) {
        // Base cases
        if (n == 0) {
            return 0;
        }
        if (n == 1 || n == 2) {
            return (f[n] = 1);
        }
 
        // If fib(n) is already computed
        if (f[n] > 0) {
            return f[n];
        }
 
        int k = ((n & 1) > 0) ? (n + 1) / 2 : n / 2;
 
        // Applying above formula [Note value n&1 is 1
        // if n is odd, else 0].
        f[n] = ((n & 1) > 0) ? (fib(k)
                * fib(k) + fib(k - 1) * fib(k - 1))
                : (2 * fib(k - 1) + fib(k)) * fib(k);
 
        return f[n];
    }
 
// Function to calculate sum of
// squares of Fibonacci numbers
    public static int calculateSumOfSquares(int n) {
        return fib(n) * fib(n + 1);
    }
}
 
// Driver Code
class geek {
 
    public static void main(String[] args) {
        gfg g = new gfg();
        int n = 6;
        System.out.println("Sum of Squares of Fibonacci numbers is : "
                + g.calculateSumOfSquares(n));
    }
 
}
// This code is contributed by PrinciRaj1992

Python3

# Python3 program to find sum of squares
# of Fibonacci numbers in O(Log n) time.
MAX = 1000
 
# Create an array for memoization
f = [0 for i in range(MAX)]
 
# Returns n'th Fibonacci number using
# table f[]
def fib(n):
     
    # Base cases
    if n == 0:
        return 0
    if n == 1 or n == 2:
        return 1
 
    # If fib(n) is already computed
    if f[n]:
        return f[n]
 
    if n & 1:
        k = (n + 1) // 2
    else:
        k = n // 2
 
    # Applying above formula[Note value
    # n & 1 is 1 if n is odd, else 0].
    if n & 1:
        f[n] = (fib(k) * fib(k) +
                fib(k - 1) * fib(k - 1))
    else:
        f[n] = ((2 * fib(k - 1) +
                     fib(k)) * fib(k))
    return f[n]
 
# Function to calculate sum of
# squares of Fibonacci numbers
def calculateSumOfSquares(n):
 
    return fib(n) * fib(n + 1)
 
# Driver Code
n = 6
print("Sum of Squares of "
      "Fibonacci numbers is :",
      calculateSumOfSquares(n))
 
# This code is contributed by Gaurav Kumar Tailor

C#

// C# Program to find sum of squares of
// Fibonacci numbers in O(Log n) time.
using System;
class gfg
{
 int []f = new int [1000];
  // Create an array for memoization
      
 // Returns n'th Fibonacci number using table f[] 
 public int fib(int n)
 {
    // Base cases
    if (n == 0)
        return 0;
    if (n == 1 || n == 2)
        return (f[n] = 1);
 
    // If fib(n) is already computed
    if (f[n]>0)
        return f[n];
 
    int k = ((n & 1)>0) ? (n + 1) / 2 : n / 2;
 
    // Applying above formula [Note value n&1 is 1
    // if n is odd, else 0].
    f[n] = ((n & 1)>0) ? (fib(k) * fib(k) + fib(k - 1) * fib(k - 1))
                : (2 * fib(k - 1) + fib(k)) * fib(k);
 
    return f[n];
 }
 
// Function to calculate sum of
// squares of Fibonacci numbers
public int calculateSumOfSquares(int n)
 {
    return fib(n) * fib(n + 1);
 }
}
 
// Driver Code
class geek
{
 public static int Main()
 {
    gfg g = new gfg();
    int n = 6;
    Console.WriteLine( "Sum of Squares of Fibonacci numbers is : {0}", g.calculateSumOfSquares(n));
    return 0;
 }
     
}

的PHP


Java脚本


输出:
Sum of Squares of Fibonacci numbers is : 104