//For a string of n bits x1, x2, x3, ..., Xn the adjacent bit count of the string(AdjBC(x)) is given by
//
//
//X1*X2 + X2*X3 + X3*X4 + ... + Xn - 1 * Xn
//
//
//which counts the number of times a 1 bit is adjacent to another 1 bit.For example :
//AdjBC(011101101) = 3
//AdjBC(111101101) = 4
//AdjBC(010101010) = 0
//
//Write a program which takes as input integers n and k and returns the number of bit
//strings x of n bits(out of 2ⁿ) that satisfy AdjBC(x) = k.For example, for 5 bit strings,
//there are 6 ways of getting AdjBC(x) = 2 :
//11100, 01110, 00111, 10111, 11101, 11011
//
//Input
//
//The first line of input contains a single integer P, (1 ≤ P ≤ 1000), which is the number
//of data sets that follow.Each data set is a single line that contains the data set
//number, followed by a space, followed by a decimal integer giving the number(n) of bits
//in the bit strings, followed by a single space, followed by a decimal integer(k) giving
//the desired adjacent bit count.The number of bits(n) will not be greater than 100 and
//the parameters n and k will be chosen so that the result will fit in a signed 32 - bit
//integer.
//
//Output
//
//For each data set there is one line of output.It contains the data set number followed
//by a single space, followed by the number of n - bit strings with adjacent bit count
//equal to k.
#include <stdio.h>
//data table containing all previously counted values;
unsigned int ***data;
unsigned int AdjecentBitCount(int a, int b, int c);
//counts number of strings that have numberOfAdjecent number of adjecent 1s given the string lengh
//assuming that previous value was lastValue
unsigned int ComputeAdjecentBitCount(int lastValue, int bits, int adjecent){
if (adjecent < 0)
return 0;
if (adjecent == 0){
if (bits <= 1)
{
if (lastValue == 0)
return 2;
return 1;
}
}
if (adjecent < bits){
if (lastValue == 0){
return AdjecentBitCount(0, bits - 1, adjecent) + AdjecentBitCount(1, bits - 1, adjecent);
}
return AdjecentBitCount(0, bits - 1, adjecent) + AdjecentBitCount(1, bits - 1, adjecent - 1);
}
if ((adjecent == bits) && (lastValue == 1))
return 1;
return 0;
};
unsigned int AdjecentBitCount(int lastValue, int numberOfBits, int numberOfAdjecent){
if (numberOfAdjecent < 0 || numberOfBits < 0)
return 0;
//retrieves previous result from the table
if (data[numberOfBits][numberOfAdjecent][lastValue] == 0xFFFFFFFF)
data[numberOfBits][numberOfAdjecent][lastValue] = ComputeAdjecentBitCount(lastValue, numberOfBits, numberOfAdjecent);
//if there is no result in the data table, compute it and store it
return data[numberOfBits][numberOfAdjecent][lastValue];
};
int main(){
//data initialization
data = new unsigned int**[101];
for (int i = 0; i < 101; ++i){
data[i] = new unsigned int*[101];
for (int j = 0; j < 101; ++j){
data[i][j] = new unsigned int[2];
data[i][j][0] = 0xFFFFFFFF;
data[i][j][1] = 0xFFFFFFFF;
}
}
int numberOfCases;
int dissposable;
int bitsNum;
int adjecent;
scanf("%d", &numberOfCases);
for (int caseNum = 0; caseNum <numberOfCases; ++caseNum){
scanf("%d %d %d", &dissposable, &bitsNum, &adjecent);
printf("%d %u\n", caseNum + 1, AdjecentBitCount(0, bitsNum, adjecent));
}
return 0;
}
CgovL0ZvciBhIHN0cmluZyBvZiBuIGJpdHMgeDEsIHgyLCB4MywgLi4uLCBYbiB0aGUgYWRqYWNlbnQgYml0IGNvdW50IG9mIHRoZSBzdHJpbmcoQWRqQkMoeCkpIGlzIGdpdmVuIGJ5Ci8vCi8vCi8vWDEqWDIgKyBYMipYMyArIFgzKlg0ICsgLi4uICsgWG4gLSAxICogWG4KLy8KLy8KLy93aGljaCBjb3VudHMgdGhlIG51bWJlciBvZiB0aW1lcyBhIDEgYml0IGlzIGFkamFjZW50IHRvIGFub3RoZXIgMSBiaXQuRm9yIGV4YW1wbGUgOgovL0FkakJDKDAxMTEwMTEwMSkgPSAzCi8vQWRqQkMoMTExMTAxMTAxKSA9IDQKLy9BZGpCQygwMTAxMDEwMTApID0gMAovLwovL1dyaXRlIGEgcHJvZ3JhbSB3aGljaCB0YWtlcyBhcyBpbnB1dCBpbnRlZ2VycyBuIGFuZCBrIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0Ci8vc3RyaW5ncyB4IG9mIG4gYml0cyhvdXQgb2YgMuKBvykgdGhhdCBzYXRpc2Z5IEFkakJDKHgpID0gay5Gb3IgZXhhbXBsZSwgZm9yIDUgYml0IHN0cmluZ3MsCi8vdGhlcmUgYXJlIDYgd2F5cyBvZiBnZXR0aW5nIEFkakJDKHgpID0gMiA6Ci8vMTExMDAsIDAxMTEwLCAwMDExMSwgMTAxMTEsIDExMTAxLCAxMTAxMQovLwovL0lucHV0Ci8vCi8vVGhlIGZpcnN0IGxpbmUgb2YgaW5wdXQgY29udGFpbnMgYSBzaW5nbGUgaW50ZWdlciBQLCAoMSDiiaQgUCDiiaQgMTAwMCksIHdoaWNoIGlzIHRoZSBudW1iZXIKLy9vZiBkYXRhIHNldHMgdGhhdCBmb2xsb3cuRWFjaCBkYXRhIHNldCBpcyBhIHNpbmdsZSBsaW5lIHRoYXQgY29udGFpbnMgdGhlIGRhdGEgc2V0Ci8vbnVtYmVyLCBmb2xsb3dlZCBieSBhIHNwYWNlLCBmb2xsb3dlZCBieSBhIGRlY2ltYWwgaW50ZWdlciBnaXZpbmcgdGhlIG51bWJlcihuKSBvZiBiaXRzCi8vaW4gdGhlIGJpdCBzdHJpbmdzLCBmb2xsb3dlZCBieSBhIHNpbmdsZSBzcGFjZSwgZm9sbG93ZWQgYnkgYSBkZWNpbWFsIGludGVnZXIoaykgZ2l2aW5nCi8vdGhlIGRlc2lyZWQgYWRqYWNlbnQgYml0IGNvdW50LlRoZSBudW1iZXIgb2YgYml0cyhuKSB3aWxsIG5vdCBiZSBncmVhdGVyIHRoYW4gMTAwIGFuZCAKLy90aGUgcGFyYW1ldGVycyBuIGFuZCBrIHdpbGwgYmUgY2hvc2VuIHNvIHRoYXQgdGhlIHJlc3VsdCB3aWxsIGZpdCBpbiBhIHNpZ25lZCAzMiAtIGJpdAovL2ludGVnZXIuCi8vCi8vT3V0cHV0Ci8vCi8vRm9yIGVhY2ggZGF0YSBzZXQgdGhlcmUgaXMgb25lIGxpbmUgb2Ygb3V0cHV0Lkl0IGNvbnRhaW5zIHRoZSBkYXRhIHNldCBudW1iZXIgZm9sbG93ZWQgCi8vYnkgYSBzaW5nbGUgc3BhY2UsIGZvbGxvd2VkIGJ5IHRoZSBudW1iZXIgb2YgbiAtIGJpdCBzdHJpbmdzIHdpdGggYWRqYWNlbnQgYml0IGNvdW50Ci8vZXF1YWwgdG8gay4KCiNpbmNsdWRlIDxzdGRpby5oPgoKLy9kYXRhIHRhYmxlIGNvbnRhaW5pbmcgYWxsIHByZXZpb3VzbHkgY291bnRlZCB2YWx1ZXM7IAp1bnNpZ25lZCBpbnQgKioqZGF0YTsKdW5zaWduZWQgaW50IEFkamVjZW50Qml0Q291bnQoaW50IGEsIGludCBiLCBpbnQgYyk7CgovL2NvdW50cyBudW1iZXIgb2Ygc3RyaW5ncyB0aGF0IGhhdmUgbnVtYmVyT2ZBZGplY2VudCBudW1iZXIgb2YgYWRqZWNlbnQgMXMgZ2l2ZW4gdGhlIHN0cmluZyBsZW5naAovL2Fzc3VtaW5nIHRoYXQgcHJldmlvdXMgdmFsdWUgd2FzIGxhc3RWYWx1ZQp1bnNpZ25lZCBpbnQgQ29tcHV0ZUFkamVjZW50Qml0Q291bnQoaW50IGxhc3RWYWx1ZSwgaW50IGJpdHMsIGludCBhZGplY2VudCl7CglpZiAoYWRqZWNlbnQgPCAwKQoJCXJldHVybiAwOwoJaWYgKGFkamVjZW50ID09IDApewoJCWlmIChiaXRzIDw9IDEpCgkJewoJCQlpZiAobGFzdFZhbHVlID09IDApCgkJCQlyZXR1cm4gMjsKCQkJcmV0dXJuIDE7CgkJfQoJfQoJaWYgKGFkamVjZW50IDwgYml0cyl7CgkJaWYgKGxhc3RWYWx1ZSA9PSAwKXsKCQkJcmV0dXJuIEFkamVjZW50Qml0Q291bnQoMCwgYml0cyAtIDEsIGFkamVjZW50KSArIEFkamVjZW50Qml0Q291bnQoMSwgYml0cyAtIDEsIGFkamVjZW50KTsKCQl9CgkJcmV0dXJuIEFkamVjZW50Qml0Q291bnQoMCwgYml0cyAtIDEsIGFkamVjZW50KSArIEFkamVjZW50Qml0Q291bnQoMSwgYml0cyAtIDEsIGFkamVjZW50IC0gMSk7Cgl9CglpZiAoKGFkamVjZW50ID09IGJpdHMpICYmIChsYXN0VmFsdWUgPT0gMSkpCgkJcmV0dXJuIDE7CQoJcmV0dXJuIDA7CQp9OwoKdW5zaWduZWQgaW50IEFkamVjZW50Qml0Q291bnQoaW50IGxhc3RWYWx1ZSwgaW50IG51bWJlck9mQml0cywgaW50IG51bWJlck9mQWRqZWNlbnQpewoJaWYgKG51bWJlck9mQWRqZWNlbnQgPCAwIHx8IG51bWJlck9mQml0cyA8IDApCgkJcmV0dXJuIDA7CgkvL3JldHJpZXZlcyBwcmV2aW91cyByZXN1bHQgZnJvbSB0aGUgdGFibGUKCWlmIChkYXRhW251bWJlck9mQml0c11bbnVtYmVyT2ZBZGplY2VudF1bbGFzdFZhbHVlXSA9PSAweEZGRkZGRkZGKQoJCWRhdGFbbnVtYmVyT2ZCaXRzXVtudW1iZXJPZkFkamVjZW50XVtsYXN0VmFsdWVdID0gQ29tcHV0ZUFkamVjZW50Qml0Q291bnQobGFzdFZhbHVlLCBudW1iZXJPZkJpdHMsIG51bWJlck9mQWRqZWNlbnQpOwoJLy9pZiB0aGVyZSBpcyBubyByZXN1bHQgaW4gdGhlIGRhdGEgdGFibGUsIGNvbXB1dGUgaXQgYW5kIHN0b3JlIGl0CglyZXR1cm4gZGF0YVtudW1iZXJPZkJpdHNdW251bWJlck9mQWRqZWNlbnRdW2xhc3RWYWx1ZV07Cn07CgoKaW50IG1haW4oKXsKCgkvL2RhdGEgaW5pdGlhbGl6YXRpb24KCWRhdGEgPSBuZXcgIHVuc2lnbmVkIGludCoqWzEwMV07Cglmb3IgKGludCBpID0gMDsgaSA8IDEwMTsgKytpKXsKCQlkYXRhW2ldID0gbmV3ICB1bnNpZ25lZCBpbnQqWzEwMV07CgkJZm9yIChpbnQgaiA9IDA7IGogPCAxMDE7ICsrail7CgkJCWRhdGFbaV1bal0gPSBuZXcgdW5zaWduZWQgaW50WzJdOwoJCQlkYXRhW2ldW2pdWzBdID0gMHhGRkZGRkZGRjsKCQkJZGF0YVtpXVtqXVsxXSA9IDB4RkZGRkZGRkY7CgkJfQoJfQoKCQoJaW50IG51bWJlck9mQ2FzZXM7CglpbnQgZGlzc3Bvc2FibGU7CglpbnQgYml0c051bTsKCWludCBhZGplY2VudDsKCXNjYW5mKCIlZCIsICZudW1iZXJPZkNhc2VzKTsKCWZvciAoaW50IGNhc2VOdW0gPSAwOyBjYXNlTnVtIDxudW1iZXJPZkNhc2VzOyArK2Nhc2VOdW0pewoJCXNjYW5mKCIlZCAlZCAlZCIsICZkaXNzcG9zYWJsZSwgJmJpdHNOdW0sICZhZGplY2VudCk7CgkJcHJpbnRmKCIlZCAldVxuIiwgY2FzZU51bSArIDEsIEFkamVjZW50Qml0Q291bnQoMCwgYml0c051bSwgYWRqZWNlbnQpKTsKCX0KCglyZXR1cm4gMDsKfQoK