Given an integer N, the task is to print N integers ? 109 such that no two consecutive of these integers are co-prime and every 3 consecutive are co-prime.
Examples:
Input: N = 3 Output: 6 15 10
Input: N = 4 Output: 6 15 35 14
Approach:
- We can just multiply consecutive primes and for the last number just multiply the gcd(last, last-1) * 2. We do this so that the (n – 1)th number, nth and 1st numbers can also follow the property mentioned in the problem statement.
- Another important part of the problem is the fact that the numbers should be ? 109. If you just multiply consecutive prime numbers, after around 3700 numbers, the value will cross 109. So we need to only use those prime numbers whose product won’t cross 109.
- To do this efficiently, consider a small number of primes, say the first 550 primes, and select them in a way such that on making a product no number gets repeated. We first choose every prime consecutively and then choose the primes with an interval of 2 and then 3 and so on. By doing that, we already make sure that no number gets repeated.
So we will select
5, 11, 17, …
Next time, we can start with 7 and select,
7, 13, 19, …
Below is the implementation of the above approach:
C++
// C++ implementation of the approach#include <bits/stdc++.h>using namespace std;#define limit 1000000000#define MAX_PRIME 2000000#define MAX 1000000#define I_MAX 50000map<int, int> mp;int b[MAX];int p[MAX];int j = 0;bool prime[MAX_PRIME + 1];// Function to generate Sieve of// Eratosthenesvoid SieveOfEratosthenes(int n){ memset(prime, true, sizeof(prime)); for (int p = 2; p * p <= n; p++) { // If prime[p] is not changed, // then it is a prime if (prime[p] == true) { for (int i = p * p; i <= n; i += p) prime[i] = false; } } // Add the prime numbers to the array b for (int p = 2; p <= n; p++) { if (prime[p]) { b[j++] = p; } }}// Function to return the gcd of a and bint gcd(int a, int b){ if (b == 0) return a; return gcd(b, a % b);}// Function to print the required// sequence of integersvoid printSeries(int n){ SieveOfEratosthenes(MAX_PRIME); int i, g, k, l, m, d; int ar[I_MAX + 2]; for (i = 0; i < j; i++) { if ((b[i] * b[i + 1]) > limit) break; // Including the primes in a series // of primes which will be later // multiplied p[i] = b[i]; // This is done to mark a product // as existing mp[b[i] * b[i + 1]] = 1; } // Maximum number of primes that we consider d = 550; bool flag = false; // For different interval for (k = 2; (k < d - 1) && !flag; k++) { // For different starting index of jump for (m = 2; (m < d) && !flag; m++) { // For storing the numbers for (l = m + k; l < d; l += k) { // Checking for occurrence of a // product. Also checking for the // same prime occurring consecutively if (((b[l] * b[l + k]) < limit) && (l + k) < d && p[i - 1] != b[l + k] && p[i - 1] != b[l] && mp[b[l] * b[l + k]] != 1) { if (mp[p[i - 1] * b[l]] != 1) { // Including the primes in a // series of primes which will // be later multiplied p[i] = b[l]; mp[p[i - 1] * b[l]] = 1; i++; } } if (i >= I_MAX) { flag = true; break; } } } } for (i = 0; i < n; i++) ar[i] = p[i] * p[i + 1]; for (i = 0; i < n - 1; i++) cout << ar[i] << " "; g = gcd(ar[n - 1], ar[n - 2]); cout << g * 2 << endl;}// Driver Codeint main(){ int n = 4; printSeries(n); return 0;} |
Java
// Java implementation of the approachimport java.util.*;class GFG {static int limit = 1000000000;static int MAX_PRIME = 2000000;static int MAX = 1000000;static int I_MAX = 50000;static HashMap<Integer, Integer> mp = new HashMap<Integer, Integer>();static int []b = new int[MAX];static int []p = new int[MAX];static int j = 0;static boolean []prime = new boolean[MAX_PRIME + 1];// Function to generate Sieve of// Eratosthenesstatic void SieveOfEratosthenes(int n){ for(int i = 0; i < MAX_PRIME + 1; i++) prime[i] = true; for (int p = 2; p * p <= n; p++) { // If prime[p] is not changed, // then it is a prime if (prime[p] == true) { for (int i = p * p; i <= n; i += p) prime[i] = false; } } // Add the prime numbers to the array b for (int p = 2; p <= n; p++) { if (prime[p]) { b[j++] = p; } }}// Function to return the gcd of a and bstatic int gcd(int a, int b){ if (b == 0) return a; return gcd(b, a % b);}// Function to print the required// sequence of integersstatic void printSeries(int n){ SieveOfEratosthenes(MAX_PRIME); int i, g, k, l, m, d; int []ar = new int[I_MAX + 2]; for (i = 0; i < j; i++) { if ((b[i] * b[i + 1]) > limit) break; // Including the primes in a series // of primes which will be later // multiplied p[i] = b[i]; // This is done to mark a product // as existing mp.put(b[i] * b[i + 1], 1); } // Maximum number of primes that we consider d = 550; boolean flag = false; // For different interval for (k = 2; (k < d - 1) && !flag; k++) { // For different starting index of jump for (m = 2; (m < d) && !flag; m++) { // For storing the numbers for (l = m + k; l < d; l += k) { // Checking for occurrence of a // product. Also checking for the // same prime occurring consecutively if (((b[l] * b[l + k]) < limit) && mp.containsKey(b[l] * b[l + k]) && mp.containsKey(p[i - 1] * b[l]) && (l + k) < d && p[i - 1] != b[l + k] && p[i - 1] != b[l] && mp.get(b[l] * b[l + k]) != 1) { if (mp.get(p[i - 1] * b[l]) != 1) { // Including the primes in a // series of primes which will // be later multiplied p[i] = b[l]; mp.put(p[i - 1] * b[l], 1); i++; } } if (i >= I_MAX) { flag = true; break; } } } } for (i = 0; i < n; i++) ar[i] = p[i] * p[i + 1]; for (i = 0; i < n - 1; i++) System.out.print(ar[i]+" "); g = gcd(ar[n - 1], ar[n - 2]); System.out.print(g * 2);}// Driver Codepublic static void main(String[] args){ int n = 4; printSeries(n);}}// This code is contributed by 29AjayKumar |
Python3
# Python3 implementation of # the above approachlimit = 1000000000MAX_PRIME = 2000000MAX = 1000000I_MAX = 50000mp = {}b = [0] * MAXp = [0] * MAXj = 0prime = [True] * (MAX_PRIME + 1)# Function to generate Sieve of# Eratosthenesdef SieveOfEratosthenes(n): global j p = 2 while p * p <= n: # If prime[p] is not changed, # then it is a prime if (prime[p] == True): for i in range(p * p, n + 1, p): prime[i] = False p += 1 # Add the prime numbers to the array b for p in range(2, n + 1): if (prime[p]): b[j] = p j += 1# Function to return # the gcd of a and bdef gcd(a, b): if (b == 0): return a return gcd(b, a % b)# Function to print the required# sequence of integersdef printSeries(n): SieveOfEratosthenes(MAX_PRIME) ar = [0] * (I_MAX + 2) for i in range(j): if ((b[i] * b[i + 1]) > limit): break # Including the primes in a series # of primes which will be later # multiplied p[i] = b[i] # This is done to mark a product # as existing mp[b[i] * b[i + 1]] = 1 # Maximum number of # primes that we consider d = 550 flag = False # For different interval k = 2 while (k < d - 1) and not flag: # For different starting # index of jump m = 2 while (m < d) and not flag: # For storing the numbers for l in range(m + k, d, k): # Checking for occurrence of a # product. Also checking for the # same prime occurring consecutively if (((b[l] * b[l + k]) < limit) and (l + k) < d and p[i - 1] != b[l + k] and p[i - 1] != b[l] and ((b[l] * b[l + k] in mp) and mp[b[l] * b[l + k]] != 1)): if (mp[p[i - 1] * b[l]] != 1): # Including the primes in a # series of primes which will # be later multiplied p[i] = b[l] mp[p[i - 1] * b[l]] = 1 i += 1 if (i >= I_MAX): flag = True break m += 1 k += 1 for i in range(n): ar[i] = p[i] * p[i + 1] for i in range(n - 1): print(ar[i], end = " ") g = gcd(ar[n - 1], ar[n - 2]) print(g * 2)# Driver Codeif __name__ == "__main__": n = 4 printSeries(n)# This code is contributed by Chitranayal |
C#
// C# implementation of the approachusing System;using System.Collections.Generic; class GFG {static int limit = 1000000000;static int MAX_PRIME = 2000000;static int MAX = 1000000;static int I_MAX = 50000;static Dictionary<int, int> mp = new Dictionary<int, int>();static int []b = new int[MAX];static int []p = new int[MAX];static int j = 0;static bool []prime = new bool[MAX_PRIME + 1];// Function to generate Sieve of// Eratosthenesstatic void SieveOfEratosthenes(int n){ for(int i = 0; i < MAX_PRIME + 1; i++) prime[i] = true; for (int p = 2; p * p <= n; p++) { // If prime[p] is not changed, // then it is a prime if (prime[p] == true) { for (int i = p * p; i <= n; i += p) prime[i] = false; } } // Add the prime numbers to the array b for (int p = 2; p <= n; p++) { if (prime[p]) { b[j++] = p; } }}// Function to return the gcd of a and bstatic int gcd(int a, int b){ if (b == 0) return a; return gcd(b, a % b);}// Function to print the required// sequence of integersstatic void printSeries(int n){ SieveOfEratosthenes(MAX_PRIME); int i, g, k, l, m, d; int []ar = new int[I_MAX + 2]; for (i = 0; i < j; i++) { if ((b[i] * b[i + 1]) > limit) break; // Including the primes in a series // of primes which will be later // multiplied p[i] = b[i]; // This is done to mark a product // as existing mp.Add(b[i] * b[i + 1], 1); } // Maximum number of primes that we consider d = 550; bool flag = false; // For different interval for (k = 2; (k < d - 1) && !flag; k++) { // For different starting index of jump for (m = 2; (m < d) && !flag; m++) { // For storing the numbers for (l = m + k; l < d; l += k) { // Checking for occurrence of a // product. Also checking for the // same prime occurring consecutively if (((b[l] * b[l + k]) < limit) && mp.ContainsKey(b[l] * b[l + k]) && mp.ContainsKey(p[i - 1] * b[l]) && (l + k) < d && p[i - 1] != b[l + k] && p[i - 1] != b[l] && mp[b[l] * b[l + k]] != 1) { if (mp[p[i - 1] * b[l]] != 1) { // Including the primes in a // series of primes which will // be later multiplied p[i] = b[l]; mp.Add(p[i - 1] * b[l], 1); i++; } } if (i >= I_MAX) { flag = true; break; } } } } for (i = 0; i < n; i++) ar[i] = p[i] * p[i + 1]; for (i = 0; i < n - 1; i++) Console.Write(ar[i] + " "); g = gcd(ar[n - 1], ar[n - 2]); Console.Write(g * 2);}// Driver Codepublic static void Main(String[] args){ int n = 4; printSeries(n);}}// This code is contributed by 29AjayKumar |
Javascript
<script>// Javascript implementation of the approachlet limit = 1000000000let MAX_PRIME = 2000000let MAX = 1000000let I_MAX = 50000let mp = new Map();let b = new Array(MAX);let p = new Array(MAX);let j = 0;let prime = new Array(MAX_PRIME + 1);// Function to generate Sieve of// Eratosthenesfunction SieveOfEratosthenes(n){ prime.fill(true); for (let p = 2; p * p <= n; p++) { // If prime[p] is not changed, // then it is a prime if (prime[p] == true) { for (let i = p * p; i <= n; i += p) prime[i] = false; } } // Add the prime numbers to the array b for (let p = 2; p <= n; p++) { if (prime[p]) { b[j++] = p; } }}// Function to return the gcd of a and bfunction gcd(a, b){ if (b == 0) return a; return gcd(b, a % b);}// Function to print the required// sequence of integersfunction printSeries(n){ SieveOfEratosthenes(MAX_PRIME); let i, g, k, l, m, d; let ar = new Array(I_MAX + 2); for (i = 0; i < j; i++) { if ((b[i] * b[i + 1]) > limit) break; // Including the primes in a series // of primes which will be later // multiplied p[i] = b[i]; // This is done to mark a product // as existing mp[b[i] * b[i + 1]] = 1; } // Maximum number of primes that we consider d = 550; let flag = false; // For different interval for (k = 2; (k < d - 1) && !flag; k++) { // For different starting index of jump for (m = 2; (m < d) && !flag; m++) { // For storing the numbers for (l = m + k; l < d; l += k) { // Checking for occurrence of a // product. Also checking for the // same prime occurring consecutively if (((b[l] * b[l + k]) < limit) && (l + k) < d && p[i - 1] != b[l + k] && p[i - 1] != b[l] && mp[b[l] * b[l + k]] != 1) { if (mp[p[i - 1] * b[l]] != 1) { // Including the primes in a // series of primes which will // be later multiplied p[i] = b[l]; mp[p[i - 1] * b[l]] = 1; i++; } } if (i >= I_MAX) { flag = true; break; } } } } for (i = 0; i < n; i++) ar[i] = p[i] * p[i + 1]; for (i = 0; i < n - 1; i++) document.write(ar[i] + " "); g = gcd(ar[n - 1], ar[n - 2]); document.write( g * 2 + "<br>");}// Driver Codelet n = 4;printSeries(n);// This code is contributed by gfgking</script> |
6 15 35 14
Time Complexity: O(MAX_PRIME * I_MAX^2).
The time complexity of the above code is O(MAX_PRIME * I_MAX^2). Here MAX_PRIME is the maximum prime number that we have considered, I_MAX is the maximum number of prime numbers that can be produced and MAX is the maximum number that we have considered.
Space Complexity: O(MAX_PRIME + I_MAX).
The space complexity of the above code is O(MAX_PRIME + I_MAX). Here MAX_PRIME is the maximum prime number that we have considered and I_MAX is the maximum number of prime numbers that can be produced.
Another approach: List all the prime numbers up to 6 million by using the Sieve of Eratosthenes. We know the base condition i.e. N = 3 forms {6, 10, 15}.
So, we use these three values to generate further terms of the sequence.
Like {2, 3, 5}, these primes can not be used to generate sequences because they are already used in {6, 10, 15}. We also can’t use {7, 11}, which we’ll see later.
Now we have a prime list {13, 17, 19, 23, 29, ……}. We take the first prime and multiply it with 6, second with 15, third with 10, again 4th with 6, and so on…
13 * 6, 17 * 15, 19 * 10, 23 * 6, 29 * 15, ........upto N - 2 terms. (N - 1)th term = (N - 1)th prime * 7. Nth term = 7 * 11. again, first term = first term * 11 to make 1st and last noncoprime. For example, N = 5 6 * 11 * 13, 15 * 17, 10 * 19, 11 * 19, 7 * 11
Now we see that we can not use 7 and 11 from the list as these are used to generate the last and second last term.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach#include <bits/stdc++.h>using namespace std;const int MAX = 620000;int prime[MAX];// Function for Sieve of Eratosthenesvoid Sieve(){ for (int i = 2; i < MAX; i++) { if (prime[i] == 0) { for (int j = 2 * i; j < MAX; j += i) { prime[j] = 1; } } }}// Function to print the required sequencevoid printSequence(int n){ Sieve(); vector<int> v, u; // Store only the required primes for (int i = 13; i < MAX; i++) { if (prime[i] == 0) { v.push_back(i); } } // Base condition if (n == 3) { cout << 6 << " " << 10 << " " << 15; return; } int k; for (k = 0; k < n - 2; k++) { // First integer in the list if (k % 3 == 0) { u.push_back(v[k] * 6); } // Second integer in the list else if (k % 3 == 1) { u.push_back(v[k] * 15); } // Third integer in the list else { u.push_back(v[k] * 10); } } k--; // Generate (N - 1)th term u.push_back(v[k] * 7); // Generate Nth term u.push_back(7 * 11); // Modify first term u[0] = u[0] * 11; // Print the sequence for (int i = 0; i < u.size(); i++) { cout << u[i] << " "; }}// Driver codeint main(){ int n = 4; printSequence(n); return 0;} |
Java
// Java implementation of the approachimport java.util.*;class GFG{ static int MAX = 620000; static int[] prime = new int[MAX]; // Function for Sieve of Eratosthenes static void Sieve() { for (int i = 2; i < MAX; i++) { if (prime[i] == 0) { for (int j = 2 * i; j < MAX; j += i) { prime[j] = 1; } } } } // Function to print the required sequence static void printSequence(int n) { Sieve(); Vector<Integer> v = new Vector<Integer>(); Vector<Integer> u = new Vector<Integer>(); // Store only the required primes for (int i = 13; i < MAX; i++) { if (prime[i] == 0) { v.add(i); } } // Base condition if (n == 3) { System.out.print(6 + " " + 10 + " " + 15); return; } int k; for (k = 0; k < n - 2; k++) { // First integer in the list if (k % 3 == 0) { u.add(v.get(k) * 6); } // Second integer in the list else if (k % 3 == 1) { u.add(v.get(k) * 15); } // Third integer in the list else { u.add(v.get(k) * 10); } } k--; // Generate (N - 1)th term u.add(v.get(k) * 7); // Generate Nth term u.add(7 * 11); // Modify first term u.set(0, u.get(0) * 11); // Print the sequence for (int i = 0; i < u.size(); i++) { System.out.print(u.get(i) + " "); } } // Driver code public static void main(String[] args) { int n = 4; printSequence(n); }} // This code is contributed by Rajput-Ji |
Python3
# Python3 program for the above approachMAX = 620000prime = [0] * MAX# Function for Sieve of Eratosthenesdef Sieve(): for i in range(2, MAX): if (prime[i] == 0): for j in range(2 * i, MAX, i): prime[j] = 1# Function to print the required sequencedef printSequence (n): Sieve() v = [] u = [] # Store only the required primes for i in range(13, MAX): if (prime[i] == 0): v.append(i) # Base condition if (n == 3): print(6, 10, 15) return k = 0 for k in range(n - 2): # First integer in the list if (k % 3 == 0): u.append(v[k] * 6) # Second integer in the list elif (k % 3 == 1): u.append(v[k] * 15) # Third integer in the list else: u.append(v[k] * 10) # Generate (N - 1)th term u.append(v[k] * 7) # Generate Nth term u.append(7 * 11) # Modify first term u[0] = u[0] * 11 # Print the sequence print(*u)# Driver codeif __name__ == '__main__': n = 4 printSequence(n)# This code is contributed by himanshu77 |
C#
// C# implementation of the approachusing System;using System.Collections.Generic; class GFG{ static int MAX = 620000; static int[] prime = new int[MAX]; // Function for Sieve of Eratosthenes static void Sieve() { for (int i = 2; i < MAX; i++) { if (prime[i] == 0) { for (int j = 2 * i; j < MAX; j += i) { prime[j] = 1; } } } } // Function to print the required sequence static void printSequence(int n) { Sieve(); List<int> v = new List<int>(); List<int> u = new List<int>(); // Store only the required primes for (int i = 13; i < MAX; i++) { if (prime[i] == 0) { v.Add(i); } } // Base condition if (n == 3) { Console.Write(6 + " " + 10 + " " + 15); return; } int k; for (k = 0; k < n - 2; k++) { // First integer in the list if (k % 3 == 0) { u.Add(v[k] * 6); } // Second integer in the list else if (k % 3 == 1) { u.Add(v[k] * 15); } // Third integer in the list else { u.Add(v[k] * 10); } } k--; // Generate (N - 1)th term u.Add(v[k] * 7); // Generate Nth term u.Add(7 * 11); // Modify first term u[0] = u[0] * 11; // Print the sequence for (int i = 0; i < u.Count; i++) { Console.Write(u[i] + " "); } } // Driver code public static void Main(String[] args) { int n = 4; printSequence(n); }}// This code is contributed by Princi Singh |
Javascript
<script>// Javascript implementation of the approach let MAX = 620000; let prime = new Array(MAX); for(let i=0;i<MAX;i++) { prime[i]=0; } // Function for Sieve of Eratosthenes function Sieve() { for (let i = 2; i < MAX; i++) { if (prime[i] == 0) { for (let j = 2 * i; j < MAX; j += i) { prime[j] = 1; } } } } // Function to print the required sequence function printSequence(n) { Sieve(); let v = []; let u = []; // Store only the required primes for (let i = 13; i < MAX; i++) { if (prime[i] == 0) { v.push(i); } } // Base condition if (n == 3) { document.write(6 + " " + 10 + " " + 15); return; } let k; for (k = 0; k < n - 2; k++) { // First integer in the list if (k % 3 == 0) { u.push(v[k] * 6); } // Second integer in the list else if (k % 3 == 1) { u.push(v[k] * 15); } // Third integer in the list else { u.push(v[k] * 10); } } k--; // Generate (N - 1)th term u.push(v[k] * 7); // Generate Nth term u.push(7 * 11); // Modify first term u[0] = u[0] * 11; // Print the sequence for (let i = 0; i < u.length; i++) { document.write(u[i] + " "); } } // Driver code let n = 4; printSequence(n);// This code is contributed by rag2127</script> |
858 255 119 77
Time Complexity : O(n*log(n))
Space Complexity: O(n)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
