Вот он с нуля (хотя и не проверял его полностью):
Пусть C[k, i, d]
будет числом всех подпоследовательностей k
длины A[1..i]
, так что GCD для них равен d
.
Тогда
C[k, i, d] = Sum(C[k - 1, i - 1, d']) + C[k, i - 1, d]
, где суммирование по всем d'
такое, что gcd(A[i], d') = d
.
Первый член (сумма) соответствует случаю, когда мы берем все последовательности из A[1..i-1]
и присоединяем к ним A[i]
. Последний термин - когда мы не включаем A[i]
.
Пусть S[k, i, d]
- общая сумма всех подпоследовательностей k
длины A[1..i]
, так что GCD для них равен d
.
Тогда
S[k, i, d] = Sum(C[k - 1, i - 1, d'] * A[i] + S[k - 1, i - 1, d']) + S[k, i - 1, d]
где суммирование по всем d'
такое, что gcd(A[i], d') = d
.
Тогда, имея S[k, i, d]
и зная все возможные значения d
, мы можем вычислить требуемое значение.