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; }
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; }