Advertisement
T-D-K

Untitled

Jan 27th, 2019
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.60 KB | None | 0 0
  1. Да. Это задача чисто на динамику.
  2. Грубо говоря. У нас есть входной массив arr, и есть два вспомогательных массива: counts, pairs. Counts[i] показывает сколько раз i встретился в arr, а Pairs - сколько пар {i, i/r} уже встретилось для числа i.
  3. Тогда в цикле по arr, для каждого i можно так всё это считать:
  4. Если i нацело делится на r, то сохраним результат деления в j = i / r, тогда
  5.     i образовал с j ещё counts[j] пар. -> pairs[i]+=counts[j]
  6.     j уже образовал с j / r ровно pairs[j] пар, значит текущий i образовал новых троек вида: i, i / r == j, j / r ровно pairs[j] штук, которые мы можем прибавить к результату
  7. counts[i]++;
  8.  
  9.  
  10. int n = Next();
  11. int r = Next();
  12. int[] arr = ReadArray(n);
  13. Dictionary<int, long> counts = new Dictionary<int, long>();
  14. Dictionary<int, long> pairs = new Dictionary<int, long>();
  15. long result = 0;
  16. foreach (int i in arr) {
  17.     if(!counts.ContainsKey(i)) {
  18.         counts.Add(i, 0);
  19.         pairs.Add(i, 0);
  20.     }
  21.     if(i % r == 0) {
  22.         int j = i / r;
  23.         long jc;
  24.         if(counts.TryGetValue(j, out jc)) {
  25.             long pj = pairs[j];
  26.             pairs[i] = pairs[i] + jc;
  27.             result += pj;
  28.         }
  29.     }
  30.     counts[i] = counts[i] + 1;
  31. }
  32. writer.Write(result);
  33. writer.Flush();
  34. writer.Close();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement