Название Описание
Для положительного целого числа х, мы определим число операций , что он должен стать двоичным «1», например , как мы знаем 1 . 3 1 0 = 1101 2 , 1101 и есть три «1», так что первичный 13 операция будет изменено на 3. Очевидно , что для положительного целого числа, мы провели несколько раз после операции, он, безусловно , станет одним.
Заданный п и к, где п задается в двоичной системе , а п не больше , чем все решил превратить его в минимальное количество операций для ряда значений к 10 ^ 7 + 9 результата по модулю.
1 < = п < 2 1 0 0 0 , 0 <= K <= 1000 0
решение проблемы
Так как в двоичной п максимальной длиной 1000, так что максимум 1000 1, время преобразования составляет не более 1000.
Мы можем обрабатывать текущее количество шагов также необходимо, чтобы х 1, CNT [I] = CNT [сумма [я]] + 1, сумма [I] для I-го числа в двоичной 1, суммы [I] = сумма [я ^ lowbit (я)] + 1, я ^ lowbit (я) является я крайним правым 1 удаляется в двоичной системе, это число должно первое дело, оно может быть рекурсивным, х 1000 или меньше.
Затем вы можете цифровой ДП, F [S] [число] [Пт] я представляет текущую позицию второго процесса, число от 1 до NUM
Затем конечный CNT [число] + 1 == к своего рода, Num перечисляется ряд преобразования полученного.
Shikakisaki 就 WA Рё ....
При рассмотрении к = 0, то на выходе будет 0, а 1 легко найти решение, потому что CNT работает один раз, и 1 не должны работать, поэтому специальный приговорена к = 0.
При к = 1, то ответ будет более чем в 2 раза, это происходит потому, что отношения между 0 и 1, так что [0] CNT установлен в отрицательной, то ответ Laid предложения к = -1 до 1.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# include <бит / STDC ++ ч.> с использованием пространства имен STD; константный ИНТ моды = 1000000007 ; Const INT maxn = 1005 ; символ с [maxn]; INT к, длина, Num [maxn]; ИНТ сумма [maxn], CNT [maxn]; INT F [maxn] [maxn] [ 2 ]; недействительными инициализации () { сумма [ 0 ] = 0 ; CNT [ 1 ] = 0 ; CNT [ 0 ] = - 2 ; для ( INT I = 1 ; я <=Тысяча ; я ++) , сумма [I] = сумма [я ^ (я & -i)] + 1 ; для ( INT I = 2 ; г <= 1000 ; я ++) CNT [I] = CNT [сумма [я]] + 1 ; } INT ДФС ( INT s, ИНТ с, BOOL Ит) { если (s!) Возвращение CNT [с] + 1 == к; если (е [s] [с] [Нт] = - 1 ) возвращение е [s] [с] [Нт]; ИНТ х = Нт? Num [с]: 1 ; INT RET = 0 ; для (Int я = 0 ; я <= х; я ++ ) RET = (RET + ДФС (втор- 1 , с + (я == 1 ), Lim && я == х))% по модулю; вернуться F [S] [C] [Пт] = RET; } INT сх () { MemSet (е, - 1 , SizeOf (е)); вернуться в глубину (LEN, 0 , правда ); } INT основных () { инициализации (); зсапЕ ( " % S% d " , с, & к); если (! к) {Е ( " 1 " ); вернуть 0 ;} LEN = StrLen (ы); для ( INT I = 1 ; г <= Len; я ++) Num [I] = S [LEN-я] - ' 0 ' ; INT ANS = сх (); если (к == 1 ) ans-- ; Е ( " % d " , ANS); }
То, что Интернет является числом комбинаций, очевидно, есть цифровая метка DP (не скрывать свои комбинации чисел)