Adjacent Bit Counts
时间限制:1000 ms | 内存限制:65535 KB
难度:4
描述
For a string of n bits x1,x2,x3,…,xn,the adjacent bit count of the string is given by fun(x)=x1*x2+x2*x3+x3*x 4+…+xn-1*xnwhich counts the number of times a 1 bit is adjacent to another 1 bit.For example:
Fun(011101101)=3
Fun(111101101)=4
Fun(010101010)=0
Write a program which takes as input integers n and p and returns the number of bit strings x of n bits(out of 2ⁿ)that satisfy Fun(x)=p.
For example,for 5 bit strings,there are 6 ways of getting fun(x)=2:
11100,01110,00111,10111,11101,11011
输入
On the first line of the input is a single positive integer k,telling the number of test cases to follow.1≤k≤10 Each case is a single line that contains a decimal integer giving the number(n)of bits in the bit strings,followed by a single space,followed by a decimal integer(p)giving the desired adjacent bit count.1≤n,p≤100
输出
For each test case,output a line with the number of n-bit strings with adjacent bit count equal to p.
样例输入
2
5 2
20 8
样例输出
6
63426
题意: 长度为n的0,1字符串按照下面的公式,组成值为p的个数1≤n,p≤100;
fun(x)=x1*x2+x2*x3+x3*x 4+…+xn-1*xn
例如:
Fun(011101101)=3
Fun(111101101)=4
Fun(010101010)=0
f[i][j][0] 长度为j的串第j位是0时组成值为i的个数;f[i][j][0]=f[i][j-1][1]+f[i][j-1][1];
f[i][j][1] 长度为j的串第j位是1时组成值为i的个数;f[i][j][1]=f[i-1][j-1][1]+f[i-1][j-1][0];
初始化:f[0][1][0]=f[0][1][1]=1;
#include<stdio.h>
long long f[105][105][2];
void init()
{//打表
f[0][1][0]=1;
f[0][1][1]=1;
for(int i=2;i<=100;i++)
{
f[0][i][0]=f[0][i-1][0]+f[0][i-1][1];
f[0][i][1]=f[0][i-1][0];
}
for(int i=1;i<=100;i++)
for(int j=2;j<=100;j++)
{
f[i][j][0]=f[i][j-1][1]+f[i][j-1][0];
f[i][j][1]=f[i-1][j-1][1]+f[i][j-1][0];
}
}
int main()
{
init();
int k,n,p;
scanf("%d",&k);
while(k--)
{
scanf("%d%d",&n,&p);
printf("%lld\n",f[p][n][0]+f[p][n][1]);
}
}