Beispiel #1
0
        public static long C(long n)
        {
            long result     = 0;
            var  points     = PointFactory.P(n).OrderBy(point => point.A).ToList();
            var  invIndexes = new InvIndex[points.Count];

            Parallel.For(0, points.Count, i =>
            {
                var max       = GetInverseIndex(points, i, false);
                var min       = (max - 1) % points.Count;
                invIndexes[i] = new InvIndex(min, max);
            });
            invIndexes = invIndexes.OrderBy(i => i.Min).ToArray();

            long lastSum = 0;

            for (var i = 1; i < invIndexes.Count(); i++)
            {
                lastSum += invIndexes[i].Min - invIndexes[0].Max + 1;
            }
            var totalSum = lastSum;

            for (var i = 1; i < invIndexes.Count(); i++)
            {
                if (invIndexes[i].Min == invIndexes[i - 1].Min && invIndexes[i].Max == invIndexes[i - 1].Max)
                {
                    continue;
                }
                lastSum  -= (invIndexes[i].Min - invIndexes[i - 1].Max + 1) * (invIndexes.Count() - i);
                totalSum += lastSum;
            }
            return(totalSum);



            //for (var i = 0; i < points.Count; i++)
            //{
            //    for (var j = i + 1; j < points.Count; j++)
            //    {
            //            result += invIndexes[j].Min  > invIndexes[i].Max
            //                ? invIndexes[j].Min - invIndexes[i].Max
            //                : invIndexes[j].Min + points.Count - invIndexes[i].Max;
            //    }
            //}
            //return result;
        }
Beispiel #2
0
        public static long C(long n)
        {
            long result = 0;
            var points = PointFactory.P(n).OrderBy(point => point.A).ToList();
            var invIndexes = new InvIndex[points.Count];
            Parallel.For(0, points.Count, i =>
            {
                var max = GetInverseIndex(points, i, false);
                var min = (max - 1)%points.Count;
                invIndexes[i] = new InvIndex(min, max);
            });
            invIndexes = invIndexes.OrderBy(i => i.Min).ToArray();

            long lastSum = 0;
            for (var i = 1; i < invIndexes.Count(); i++)
            {
                lastSum += invIndexes[i].Min - invIndexes[0].Max + 1;
            }
            var totalSum = lastSum;
            for (var i = 1; i < invIndexes.Count(); i++)
            {
                if (invIndexes[i].Min == invIndexes[i - 1].Min && invIndexes[i].Max == invIndexes[i - 1].Max)
                {
                    continue;
                }
                lastSum -= (invIndexes[i].Min - invIndexes[i - 1].Max + 1)* (invIndexes.Count() - i);
                totalSum += lastSum;
            }
            return totalSum;

            //for (var i = 0; i < points.Count; i++)
            //{
            //    for (var j = i + 1; j < points.Count; j++)
            //    {
            //            result += invIndexes[j].Min  > invIndexes[i].Max
            //                ? invIndexes[j].Min - invIndexes[i].Max
            //                : invIndexes[j].Min + points.Count - invIndexes[i].Max;
            //    }
            //}
            //return result;
        }