public static long Solution1()
        {
            long solution     = 0;
            long power        = UtilityFunctions.IntegralPower(2, order) - 1;
            var  primes       = UtilityFunctions.Primes(UtilityFunctions.IntegralPower(2, order / 4));
            var  primeFactors = new List <long>();
            var  ordersModP   = new List <long>();
            var  powersOfTwo  = new Dictionary <long, long>();
            bool keyAdded     = false;
            var  factors      = new Dictionary <long, long>();

            for (int i = 2; i <= Math.Sqrt(order); i++)
            {
                if (order % i == 0)
                {
                    powersOfTwo.Add(i, UtilityFunctions.IntegralPower(2, i) - 1);
                    if (i * i != order)
                    {
                        powersOfTwo.Add(order / i, UtilityFunctions.IntegralPower(2, order / i) - 1);
                    }
                }
            }

            var keys = powersOfTwo.Keys.OrderBy(t => t).ToArray();

            foreach (var p in primes)
            {
                if (power < p * p)
                {
                    keyAdded = false;
                    primeFactors.Add(power);
                    foreach (var key in keys)
                    {
                        if (powersOfTwo[key] % power == 0)
                        {
                            keyAdded = true;
                            ordersModP.Add(key);
                            break;
                        }
                    }
                    if (!keyAdded)
                    {
                        ordersModP.Add(order);
                    }
                    break;
                }
                var primePower = p;
                while (power % p == 0)
                {
                    keyAdded = false;
                    primeFactors.Add(p);
                    foreach (var key in keys)
                    {
                        if (powersOfTwo[key] % primePower == 0)
                        {
                            keyAdded = true;
                            ordersModP.Add(key);
                            break;
                        }
                    }
                    if (!keyAdded)
                    {
                        ordersModP.Add(order);
                    }
                    power      /= p;
                    primePower *= p;
                }
            }

            factors.Add(1, 1);

            for (int i = 0; i < primeFactors.Count; i++)
            {
                keys = factors.Keys.ToArray();
                foreach (var key in keys)
                {
                    var newKey = key * primeFactors[i];
                    if (!factors.ContainsKey(newKey))
                    {
                        factors.Add(newKey, UtilityFunctions.Lcm(factors[key], ordersModP[i]));
                    }
                }
            }

            foreach (var factor in factors)
            {
                if (factor.Value == order)
                {
                    solution += factor.Key + 1;
                }
            }


            return(solution);
        }