Member 12658724 Ответов: 2

Поймите две строки простого кода


У меня есть метод из интернета.
static void Main(String[] args)
{
    var nk = Console.ReadLine().Split(' ').Select(Int32.Parse)
                    .ToArray();
    int n = nk[0];
    int k = nk[1];
    var arr = Console.ReadLine().Split(' ').Select(Int32.Parse)
                     .ToArray();
        
    var count = 0;
    var counts = new int[k];
    for (var i = 0; i < n; i++)
    {
        // the idea is that if (a1 + a2) % k == 0
        // then (a1 % k + a2 % k) should be equal to k (or 0)
        var bucket = arr[i] % k;
        // adding all new combinations with arr[i] to the count
        // also handling bucket == 0 with % k here
        count += counts[(k - bucket) % k];
        counts[bucket]++;
    }
        
    Console.WriteLine(count);
}


Самое сложное - это код последних двух строк.
count += counts[(k - bucket) % k];
       counts[bucket]++;

Я этого не понимаю, не могли бы вы переписать его получше?

Что я уже пробовал:

Пока никаких зацепок. Я попытался войти в код.

2 Ответов

Рейтинг:
17

OriginalGriff

Нет, не очень много.

count += counts[(k - bucket) % k];
       counts[bucket]++;
Вторая строка очевидна: это просто добавление единицы к элементу массива.
Первый ряд тоже не очень сложен, если разбить его на части:
int index = (k - bucket) % k;
count = count + counts[index];
И я уверен, что вы знаете, что делают операторы минус и модуль!


Рейтинг:
1

0x01AA

var bucket = arr[i] % k;
кажется, об этом не может быть и речи, поэтому я предполагаю, что операторы "%" и "[]" подходят вам.


count += counts[(k - bucket) % k];
Новое здесь вот в чем +=. Вы можете написать вышеизложенное также как
count = count + counts[(k - bucket) % k];



counts[bucket]++;
Здесь я предполагаю, что "++" не совсем ясно. Это означает просто увеличить значение на единицу. Вы можете написать это как
counts[bucket]= counts[bucket] + 1;


Надеюсь, я смогу вам помочь.