Ok давайте Повсеместно код,
Сначала эта функция nChoosek: это функция, вычислить комбинацию калькулятор, и это то, что будет использоваться для решения проблемы
Conbinaison в основном количество выбора часть коллекции https://en.wikipedia.org/wiki/Combination
Пример массива {1, 2, 3}, если я скажу, что вы выбрали два элемента из трех элементов массива, это комбинация буксировки из трех, в коде это nChoosek (2,3) = card {(1,2), (2,3), (1,3)} = 3
Если мы рассмотрим проблему с этими тремя дополнительными условиями
1- вы не можете умножить один и тот же элемент дважды
2- п < = к
3- нет нуля в массиве
Решения здесь будет nChoosek (к, п), но так как эти ограничения существуют мы имеем дело с каждым из них
Для самых сначала мы можем умножить один и тот же элемент дважды: так что для nChoosek (k, n) нам нужно количество массива, которое мы можем получить, если умножить элемент (или много) на два на -1 .. , но подождите, давайте рассмотрим комбинацию когда мы умножаем один элемент дважды: здесь мы потеряли два умножения без изменения массива, поэтому количество комбинаций, которое у нас есть, будет nChoosek (k -2, n)
Точно так же, если мы решили умножить два элемента в два раза на результат будет nChoosek (k -4, n)
Отсюда происходит
for(; i >= 0; i -= 2){
ans += nChoosek(n, i);
ans = ans % (1000000007l);
}
Для случая, когда к> п применения алгоритма означает, что мы будем умножать по крайней мере один элемент в два раза, так что похоже на применение нового алгоритма с к-2 и п
, если k- 2 еще больше, чем n, мы можем по той же логике преобразовать его в эквивалент с n и k-4 и так далее, пока k-2 * i < = n и k-2 * (i + 1)> 0
Очевидно вот что это к-2 * я будет п или п-1, так что новый будет к п или п-1, и это оправдывает этот код
if(k <= n){
i = k;
}else if((k % 2 == 0 && n % 2 == 0) || (k % 2 != 0 && n % 2 != 0)){
i = n;
}else if((k % 2 == 0 && n % 2 != 0) || (k % 2 != 0 && n % 2 == 0)){
i = n - 1;
}
Теперь история нуля, если мы рассмотрим T1 = {1,2,3} и T2 = {0,1,0,0,2,3,0,0,0} и k = 2, вы можете заметить, что дело с массивом с длиной = n и имеет m нуль, похоже на дело с массивом длины = nm без нуля
спасибо, что это очень простое объяснение для начала: – Godfather