# Count of AP (Arithmetic Progression) Subsequences in an array

Last Updated : 12 Sep, 2023

Given an array of n positive integers. The task is to count the number of Arithmetic Progression subsequence in the array. Note: Empty sequence or single element sequence is Arithmetic Progression. 1 <= arr[i] <= 1000000.
Examples:

```Input : arr[] = { 1, 2, 3 }
Output : 8
Arithmetic Progression subsequence from the
given array are: {}, { 1 }, { 2 }, { 3 }, { 1, 2 },
{ 2, 3 }, { 1, 3 }, { 1, 2, 3 }.

Input : arr[] = { 10, 20, 30, 45 }
Output : 12

Input : arr[] = { 1, 2, 3, 4, 5 }
Output : 23```

Recommended Practice

Since empty sequence and single element sequence is also arithmetic progression, so we initialize the answer with n(number of element in the array) + 1.
Now, we need to find the arithmetic progression subsequence of length greater than or equal to 2. Let minimum and maximum of the array be minarr and maxarr respectively. Observe, in all the arithmetic progression subsequences, the range of common difference will be from (minarr – maxarr) to (maxarr – minarr). Now, for each common difference, say d, calculate the subsequence of length greater than or equal to 2 using dynamic programming.
Let dp[i] be the number of subsequence that end with arr[i] and have common difference of d. So,

The number of subsequence of length greater than or equal to 2 with common difference d is sum of dp[i] – 1, 0 <= i = 2 with difference d. To speed up, store the sum of dp[j] with arr[j] + d = arr[i] and j < i.
Below is implementation of above idea :

## C++

 `// C++ program to find number of AP ` `// subsequences in the given array ` `#include ` `#define MAX 1000001 ` `using` `namespace` `std; ` ` `  `int` `numofAP(``int` `a[], ``int` `n) ` `{ ` `    ``// initializing the minimum value and ` `    ``// maximum value of the array. ` `    ``int` `minarr = INT_MAX, maxarr = INT_MIN; ` ` `  `    ``// Finding the minimum and maximum ` `    ``// value of the array. ` `    ``for` `(``int` `i = 0; i < n; i++) ` `    ``{ ` `        ``minarr = min(minarr, a[i]); ` `        ``maxarr = max(maxarr, a[i]); ` `    ``} ` ` `  `    ``// dp[i] is going to store count of APs ending ` `    ``// with arr[i]. ` `    ``// sum[j] is going to store sum of all dp[]'s ` `    ``// with j as an AP element. ` `    ``int` `dp[n], sum[MAX]; ` ` `  `    ``// Initialize answer with n + 1 as single elements ` `    ``// and empty array are also DP. ` `    ``int` `ans = n + 1; ` ` `  `    ``// Traversing with all common difference. ` `    ``for` `(``int` `d=(minarr-maxarr); d<=(maxarr-minarr); d++) ` `    ``{ ` `        ``memset``(sum, 0, ``sizeof` `sum); ` ` `  `        ``// Traversing all the element of the array. ` `        ``for` `(``int` `i = 0; i < n; i++) ` `        ``{ ` `            ``// Initialize dp[i] = 1. ` `            ``dp[i] = 1; ` ` `  `            ``// Adding counts of APs with given differences ` `            ``// and a[i] is last element.   ` `            ``// We consider all APs where an array element ` `            ``// is previous element of AP with a particular  ` `            ``// difference ` `            ``if` `(a[i] - d >= 1 && a[i] - d <= 1000000) ` `                ``dp[i] += sum[a[i] - d]; ` ` `  `            ``ans += dp[i] - 1; ` `            ``sum[a[i]] += dp[i]; ` `        ``} ` `    ``} ` ` `  `    ``return` `ans; ` `} ` ` `  `// Driver code ` `int` `main() ` `{ ` `    ``int` `arr[] = { 1, 2, 3 }; ` `    ``int` `n = ``sizeof``(arr)/``sizeof``(arr[0]); ` `    ``cout << numofAP(arr, n) << endl; ` `    ``return` `0; ` `} `

## Java

 `// Java program to find number of AP ` `// subsequences in the given array ` `import` `java.util.Arrays; ` ` `  `class` `GFG { ` `     `  `    ``static` `final` `int` `MAX = ``1000001``; ` ` `  `    ``static` `int` `numofAP(``int` `a[], ``int` `n) ` `    ``{ ` `         `  `        ``// initializing the minimum value and ` `        ``// maximum value of the array. ` `        ``int` `minarr = +``2147483647``; ` `        ``int` `maxarr = -``2147483648``; ` ` `  `        ``// Finding the minimum and maximum ` `        ``// value of the array. ` `        ``for` `(``int` `i = ``0``; i < n; i++) { ` `            ``minarr = Math.min(minarr, a[i]); ` `            ``maxarr = Math.max(maxarr, a[i]); ` `        ``} ` ` `  `        ``// dp[i] is going to store count of  ` `        ``// APs ending with arr[i]. ` `        ``// sum[j] is going to store sum of  ` `        ``// all dp[]'s with j as an AP element. ` `        ``int` `dp[] = ``new` `int``[n]; ` `        ``int` `sum[] = ``new` `int``[MAX]; ` ` `  `        ``// Initialize answer with n + 1 as  ` `        ``// single elements and empty array  ` `        ``// are also DP. ` `        ``int` `ans = n + ``1``; ` ` `  `        ``// Traversing with all common  ` `        ``// difference. ` `        ``for` `(``int` `d = (minarr - maxarr);  ` `                ``d <= (maxarr - minarr); d++)  ` `        ``{ ` `            ``Arrays.fill(sum, ``0``); ` ` `  `            ``// Traversing all the element  ` `            ``// of the array. ` `            ``for` `(``int` `i = ``0``; i < n; i++) { ` `                 `  `                ``// Initialize dp[i] = 1. ` `                ``dp[i] = ``1``; ` ` `  `                ``// Adding counts of APs with ` `                ``// given differences and a[i]  ` `                ``// is last element. ` `                ``// We consider all APs where  ` `                ``// an array element is previous  ` `                ``// element of AP with a particular ` `                ``// difference ` `                ``if` `(a[i] - d >= ``1` `&&  ` `                             ``a[i] - d <= ``1000000``) ` `                    ``dp[i] += sum[a[i] - d]; ` ` `  `                ``ans += dp[i] - ``1``; ` `                ``sum[a[i]] += dp[i]; ` `            ``} ` `        ``} ` ` `  `        ``return` `ans; ` `    ``} ` `     `  `    ``// Driver code ` `    ``public` `static` `void` `main(String[] args) ` `    ``{ ` `        ``int` `arr[] = { ``1``, ``2``, ``3` `}; ` `        ``int` `n = arr.length; ` `         `  `        ``System.out.println(numofAP(arr, n)); ` `    ``} ` `} ` ` `  `// This code is contributed by Anant Agarwal. `

## Python3

 `# Python program to find number of AP ` `# subsequences in the given array ` ` `  `MAX` `=` `1000001` ` `  `def` `numofAP(a, n): ` ` `  `    ``# initializing the minimum value and ` `    ``# maximum value of the array. ` `    ``minarr ``=` `+``2147483647` `    ``maxarr ``=` `-``2147483648` ` `  `    ``# Finding the minimum and  ` `    ``# maximum value of the array. ` `    ``for` `i ``in` `range``(n): ` `        ``minarr ``=` `min``(minarr, a[i]) ` `        ``maxarr ``=` `max``(maxarr, a[i]) ` `     `  ` `  `    ``# dp[i] is going to store count of APs ending ` `    ``# with arr[i]. ` `    ``# sum[j] is going to store sum of all dp[]'s ` `    ``# with j as an AP element. ` `    ``dp ``=` `[``0` `for` `i ``in` `range``(n ``+` `1``)] ` `     `  ` `  `    ``# Initialize answer with n + 1 as single  ` `    ``# elements and empty array are also DP. ` `    ``ans ``=` `n ``+` `1` ` `  `    ``# Traversing with all common difference. ` `    ``for` `d ``in` `range``((minarr ``-` `maxarr), (maxarr ``-` `minarr) ``+` `1``): ` `        ``sum` `=` `[``0` `for` `i ``in` `range``(``MAX` `+` `1``)] ` `         `  `        ``# Traversing all the element of the array. ` `        ``for` `i ``in` `range``(n): ` `         `  `            ``# Initialize dp[i] = 1. ` `            ``dp[i] ``=` `1` ` `  `            ``# Adding counts of APs with given differences ` `            ``# and a[i] is last element.  ` `            ``# We consider all APs where an array element ` `            ``# is previous element of AP with a particular  ` `            ``# difference ` `            ``if` `(a[i] ``-` `d >``=` `1` `and` `a[i] ``-` `d <``=` `1000000``): ` `                ``dp[i] ``+``=` `sum``[a[i] ``-` `d] ` ` `  `            ``ans ``+``=` `dp[i] ``-` `1` `            ``sum``[a[i]] ``+``=` `dp[i] ` ` `  `    ``return` `ans ` ` `  `# Driver code ` `arr ``=` `[ ``1``, ``2``, ``3` `] ` `n ``=` `len``(arr) ` ` `  `print``(numofAP(arr, n)) ` ` `  `# This code is contributed by Anant Agarwal. `

## C#

 `// C# program to find number of AP ` `// subsequences in the given array ` `using` `System; ` ` `  `class` `GFG { ` `     `  `    ``static` `int` `MAX = 1000001; ` ` `  `    ``// Function to find number of AP ` `    ``// subsequences in the given array ` `    ``static` `int` `numofAP(``int` `[]a, ``int` `n) ` `    ``{ ` `         `  `        ``// initializing the minimum value and ` `        ``// maximum value of the array. ` `        ``int` `minarr = +2147483647; ` `        ``int` `maxarr = -2147483648; ` `        ``int` `i; ` `         `  `        ``// Finding the minimum and maximum ` `        ``// value of the array. ` `        ``for` `(i = 0; i < n; i++)  ` `        ``{ ` `            ``minarr = Math.Min(minarr, a[i]); ` `            ``maxarr = Math.Max(maxarr, a[i]); ` `        ``} ` ` `  `        ``// dp[i] is going to store count of  ` `        ``// APs ending with arr[i]. ` `        ``// sum[j] is going to store sum of  ` `        ``// all dp[]'s with j as an AP element. ` `        ``int` `[]dp = ``new` `int``[n]; ` `        ``int` `[]sum = ``new` `int``[MAX]; ` ` `  `        ``// Initialize answer with n + 1 as  ` `        ``// single elements and empty array  ` `        ``// are also DP. ` `        ``int` `ans = n + 1; ` ` `  `        ``// Traversing with all common  ` `        ``// difference. ` `        ``for` `(``int` `d = (minarr - maxarr);  ` `                 ``d <= (maxarr - minarr); d++)  ` `        ``{ ` `             `  `            ``for``(i = 0; i < MAX; i++) ` `            ``sum[i]= 0; ` `         `  `            ``// Traversing all the element  ` `            ``// of the array. ` `            ``for` `( i = 0; i < n; i++) ` `            ``{ ` `                 `  `                ``// Initialize dp[i] = 1. ` `                ``dp[i] = 1; ` ` `  `                ``// Adding counts of APs with ` `                ``// given differences and a[i]  ` `                ``// is last element. ` `                ``// We consider all APs where  ` `                ``// an array element is previous  ` `                ``// element of AP with a particular ` `                ``// difference ` `                ``if` `(a[i] - d >= 1 &&  ` `                    ``a[i] - d <= 1000000) ` `                    ``dp[i] += sum[a[i] - d]; ` ` `  `                ``ans += dp[i] - 1; ` `                ``sum[a[i]] += dp[i]; ` `            ``} ` `        ``} ` ` `  `        ``return` `ans; ` `    ``} ` `     `  `    ``// Driver code ` `    ``public` `static` `void` `Main() ` `    ``{ ` `        ``int` `[]arr = {1, 2, 3}; ` `        ``int` `n = arr.Length; ` `         `  `        ``Console.WriteLine(numofAP(arr, n)); ` `    ``} ` `} ` ` `  `// This code is contributed by vt_m. `

## Javascript

 ``

Output :

`8`

Time complexity: O(n*d) given an array of n positive integers and d is the difference between the maximum and minimum value in the array.

Auxiliary Space: O(MAX)

Previous
Next