using System.Collections.Generic;
Console.WriteLine("ECG Sequence Index Finder");
Console.WriteLine("========================");
Console.Write("Enter a number to find its ECG sequence index (or 'quit' to exit): ");
string input = Console.ReadLine();
if (input.ToLower() == "quit")
if (int.TryParse(input, out int number) && number > 0)
int index = GetEcgSequenceIndex(number);
Console.WriteLine($"Number {number} is at index {index} in the ECG sequence.");
var sequence = GenerateEcgSequence(index + 1);
Console.WriteLine($"ECG Sequence: [{string.Join(", ", sequence)}]");
Console.WriteLine("Please enter a valid positive integer.");
static int GetEcgSequenceIndex(int target)
var sequence = new List<int> { 1, 2 };
var used = new HashSet<int> { 1, 2 };
if (target == 1) return 0;
if (target == 2) return 1;
int lastNumber = sequence[sequence.Count - 1];
int nextNumber = FindNextNumber(used, lastNumber);
sequence.Add(nextNumber);
if (nextNumber == target)
return sequence.Count - 1;
static List<int> GenerateEcgSequence(int length)
if (length <= 0) return new List<int>();
if (length == 1) return new List<int> { 1 };
if (length == 2) return new List<int> { 1, 2 };
var sequence = new List<int> { 1, 2 };
var used = new HashSet<int> { 1, 2 };
for (int i = 2; i < length; i++)
int lastNumber = sequence[sequence.Count - 1];
int nextNumber = FindNextNumber(used, lastNumber);
sequence.Add(nextNumber);
static int FindNextNumber(HashSet<int> used, int lastNumber)
if (used.Contains(candidate))
if (SharesFactor(candidate, lastNumber))
static bool SharesFactor(int a, int b)
static int Gcd(int a, int b)