我们给了几个比特n作为二进制序列的输入。此处的目标是找到长度为2n的二进制序列,以使其前半部分和后半部分的总和相等。前n位和后n位具有相同的和。
我们有一个二进制序列,因此将数字放在任何位置的唯一选择是0和1。对于前半部分和后半部分的n位,否。可能的组合是-
n位全零(0 1)nC0 = 1
n位和1 1的nC1
n位与2 1的nC2
。
。
具有n 1的nCn的n位
对于2n位
上半部分为0 1,下半部分为0 1 nC0 X nC0
上半部分为1 1,下半部分为1 1 nC1 X nC1
前一半为2 1,后一半为2 1 nC2 X nC2
..............
前一半为n 1,后一半为n 1 nCn X nCn
这样的组合总数= nC0 * nC0 + nC1 * nC1 + ....... + nCn * nCn
=(nC0)2+(nC1)2 + .......... +(nCn)2
n=1
输出结果
Sequences with same sum of first and second half bits: 2
说明-可能的2 * 1 = 2位序列00,01,10,11这四个01和10中的总和为= 1
n=2
输出结果
Sequences with same sum of first and second half bits: 6
说明-可能的2 * 2 = 4位序列0000,0001,0010,0011,0100,0101,0110,0111,1000,1001,1010,1011,1100,1101,1110,1111
在这些序列中,前2位和后2位的总和相同-
0000,0101,0110,1001,1010,1111,总计= 6
整数“位”存储数字。
函数findSeq(int n)将n作为输入,并返回具有等于或大于前一半和后一半2n位的序列数。
变量nCi用于存储初始值= 1,因为nC0为1。
初始化ans = 0,它将把这样的序列计为nCi * nCi之和。
从i = 0到n开始将nCi * nCi添加到ans,按上述公式计算每个nCi。
在for循环结束后,返回以“ ans”表示的结果作为计数。
#include<iostream> using namespace std; //返回偶数长度序列的计数 int findSeq(int n){ int nCi=1; //nC0=1 int ans = 1; for (int i = 1; i<=n ; i++){ //nCi =(nCi-1)*(nCi / nCi-1) //nCi / nC(i-1)=(n + 1-i)/ i; nCi = (nCi * (n+1-i))/i; ans += nCi*nCi; } return ans; } int main(){ int bits = 2; cout << "Count of binary sequences such that sum of first and second half bits is same: "<<findSeq(bits); return 0; }
输出结果
Count of binary sequences such that sum of first and second half bits is same: 6