Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Да. Это задача чисто на динамику.
- Грубо говоря. У нас есть входной массив arr, и есть два вспомогательных массива: counts, pairs. Counts[i] показывает сколько раз i встретился в arr, а Pairs - сколько пар {i, i/r} уже встретилось для числа i.
- Тогда в цикле по arr, для каждого i можно так всё это считать:
- Если i нацело делится на r, то сохраним результат деления в j = i / r, тогда
- i образовал с j ещё counts[j] пар. -> pairs[i]+=counts[j]
- j уже образовал с j / r ровно pairs[j] пар, значит текущий i образовал новых троек вида: i, i / r == j, j / r ровно pairs[j] штук, которые мы можем прибавить к результату
- counts[i]++;
- int n = Next();
- int r = Next();
- int[] arr = ReadArray(n);
- Dictionary<int, long> counts = new Dictionary<int, long>();
- Dictionary<int, long> pairs = new Dictionary<int, long>();
- long result = 0;
- foreach (int i in arr) {
- if(!counts.ContainsKey(i)) {
- counts.Add(i, 0);
- pairs.Add(i, 0);
- }
- if(i % r == 0) {
- int j = i / r;
- long jc;
- if(counts.TryGetValue(j, out jc)) {
- long pj = pairs[j];
- pairs[i] = pairs[i] + jc;
- result += pj;
- }
- }
- counts[i] = counts[i] + 1;
- }
- writer.Write(result);
- writer.Flush();
- writer.Close();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement