Условие 2^m > n
необходимо, чтобы сделать формулу
Σvi = 2^0 * c1 + 2^m * c2 + ... + 2^(k-1)m * ck
обратимой из суммы в ci
.Вы не указали свою среду, поэтому я буду использовать некоторый псевдокод в стиле C
tmp = sum;
p = power(2,m);
for(i = 0; i< k; i++) {
c[i] = tmp % p; // i.e. calculate reminder, often also called mod
tmp = tmp / p; // whole division on (big) integers
}
Это должно работать, потому что условие 2^m > n
гарантирует, что с ci <= n
так транзитивно ci < 2^m
и, таким образом,не может быть "переполнения".По сути, идея состоит в том, чтобы представить подсчет голосов как число в системе с огромным числом 2^m
, а каждая цифра - это просто число голосов за соответствующего кандидата.