// [SolutionMethod] public CountTripletsAnswer BruteForce(CountTripletsSample sample) { Int64 r = sample.r; List <Int64> arr = sample.arr; //arr.Sort(); Int64 c2 = r; Int64 c3 = r * r; Int64 res = 0; for (int i = 0; i < arr.Count - 2; i++) { for (int j = i + 1; j < arr.Count - 1; j++) { if (arr[i] * c2 == arr[j]) { for (int k = j + 1; k < arr.Count; k++) { if (arr[j] == arr[i] * c2 && arr[k] == arr[i] * c3) { res++; } } } } } return(new CountTripletsAnswer() { res = res }); }
public override void CreateSamples(StreamReader reader) { string[] nm = reader.ReadLine().Split(' '); Int64 n = Convert.ToInt32(nm[0]); Int64 r = Convert.ToInt32(nm[1]); List <Int64> list = new List <Int64>(); List <long> arr = reader.ReadLine().TrimEnd().Split(' ').ToList().Select(arrTemp => Convert.ToInt64(arrTemp)).ToList(); CountTripletsSample sample = new CountTripletsSample() { arr = arr, r = r }; //sample.seq = Array.ConvertAll(reader.ReadLine().Split(' '), sTemp => Convert.ToInt64(sTemp)); Samples.Add(sample); }
public TAnswer BruteForce4(TSample Sample) { CountTripletsSample sample = Sample as CountTripletsSample; Int64 r = sample.r; List <Int64> arr = sample.arr; Int64 res = 0; if (r == 1) { List <Int64> darr = arr.Distinct().ToList(); Dictionary <Int64, Int64> cnt = new Dictionary <Int64, Int64>(); foreach (var item in darr) { cnt.Add(item, 0); } for (int i = 0; i < arr.Count; i++) { if (cnt.ContainsKey(arr[i])) { cnt[arr[i]]++; } } for (int i = 0; i < darr.Count; i++) { res += cnt[darr[i]] * (cnt[darr[i]] - 1) * (cnt[darr[i]] - 2) / 6; } } else { Dictionary <Int64, Int64> aw1 = new Dictionary <long, long>(); Dictionary <Int64, Int64> aw2 = new Dictionary <long, long>(); for (int i = 0; i < arr.Count; i++) { //число триплетов ожидающих ai*r +1 if (aw1.ContainsKey(arr[i] * r)) { aw1[arr[i] * r]++; } else { aw1.Add(arr[i] * r, 1); } // if (aw1.ContainsKey(arr[i])) { if (aw2.ContainsKey(arr[i] * r)) { aw2[arr[i] * r] += aw1[arr[i]]; } else { aw2.Add(arr[i] * r, aw1[arr[i]]); } // aw1[arr[i]] = 0; } if (aw2.ContainsKey(arr[i])) { res += aw2[arr[i]]; //aw2[arr[i]] = 0; } } } return(new CountTripletsAnswer() { res = res }); }
// [SolutionMethod] public CountTripletsAnswer BruteForce3(CountTripletsSample sample) { Int64 r = sample.r; List <Int64> arr = sample.arr; Int64 res = 0; //arr.Sort(); List <Int64> darr = arr.Distinct().ToList(); List <HashSet <Int64> > progressions = new List <HashSet <Int64> >(); List <HashSet <Int64> > arrays = new List <HashSet <Int64> >(); Dictionary <Int64, Int64> cnt = new Dictionary <Int64, Int64>(); if (r == 1) { foreach (var item in darr) { cnt.Add(item, 0); } for (int i = 0; i < arr.Count; i++) { if (cnt.ContainsKey(arr[i])) { cnt[arr[i]]++; } } for (int i = 0; i < darr.Count; i++) { res += cnt[darr[i]] * (cnt[darr[i]] - 1) * (cnt[darr[i]] - 2) / 6; } } else { for (int i = 0; i < arr.Count; i++) { if (cnt.ContainsKey(arr[i])) { cnt[arr[i]]++; } else { cnt.Add(arr[i], 1); } Int32 CPIndex = -1; for (int j = 0; j < progressions.Count; j++) { if (progressions[j].Contains(arr[i])) { CPIndex = j; break; } } if (CPIndex == -1) { progressions.Add(new HashSet <Int64>()); arrays.Add(new HashSet <Int64>()); CPIndex = progressions.Count - 1; Int64 CurrentElem = arr[i]; progressions[CPIndex].Add(CurrentElem); /* * while (CurrentElem % r == 0) { * CurrentElem /= r; * progressions[CPIndex].Add(CurrentElem); * } * CurrentElem = arr[i]; */ while (CurrentElem < arr[arr.Count - 1]) { CurrentElem *= r; progressions[CPIndex].Add(CurrentElem); if (!cnt.ContainsKey(CurrentElem)) { cnt.Add(CurrentElem, 0); } } } for (int j = 0; j < progressions.Count; j++) { if (progressions[j].Contains(arr[i])) { arrays[j].Add(arr[i]); } } } List <Int64[]> AProgressions = new List <long[]>(); List <Int64[]> AArrays = new List <long[]>(); for (int i = 0; i < progressions.Count; i++) { AProgressions.Add(progressions[i].ToArray()); AArrays.Add(arrays[i].ToArray()); } for (int i = 0; i < arrays.Count; i++) { var ca = AArrays[i]; for (int j = 0; j < ca.Length - 2; j++) { Int32 CPIndex = -1; for (int k = 0; k < progressions.Count; k++) { if (progressions[k].Contains(ca[j])) { //CPIndex = k; //break; } } if (ca[j] * r == ca[j + 1] && ca[j] * r * r == ca[j + 2]) { res += cnt[ca[j]] * cnt[ca[j + 1]] * cnt[ca[j + 2]]; } } } } return(new CountTripletsAnswer() { res = res }); }
//[SolutionMethod] public CountTripletsAnswer BruteForce2(CountTripletsSample sample) { Int64 r = sample.r; List <Int64> arr = sample.arr; List <Int64> darr = arr.Distinct().ToList(); Int64 res = 0; Dictionary <Int64, Int64> cnt = new Dictionary <long, long>(); if (r == 1) { foreach (var item in darr) { cnt.Add(item, 0); } } else { Int64 value = 1; cnt.Add(1, 0); while (value < arr[arr.Count - 1]) { value = value * r; cnt.Add(value, 0); } } for (int i = 0; i < arr.Count; i++) { if (cnt.ContainsKey(arr[i])) { cnt[arr[i]]++; } } if (r == 1) { for (int i = 0; i < darr.Count; i++) { res += cnt[darr[i]] * (cnt[darr[i]] - 1) * (cnt[darr[i]] - 2) / 6; } } else { for (int i = 0; i < darr.Count - 2; i++) { if (darr[i] * r == darr[i + 1] && darr[i] * r * r == darr[i + 2]) { res += cnt[darr[i]] * cnt[darr[i + 1]] * cnt[darr[i + 2]]; } } } return(new CountTripletsAnswer() { res = res }); }