给定数字n,请找到长度为2n的所有二进制序列的计数,以使前n位的总和与后n位的总和相同。
例子:
Input: n = 1
Output: 2
There are 2 sequences of length 2*n, the
sequences are 00 and 11
Input: n = 2
Output: 6
There are 6 sequences of length 2*n, the
sequences are 0101, 0110, 1010, 1001, 0000
and 1111
这个想法是固定第一个和最后一个比特,然后递归n-1个,即剩余的2(n-1)个比特。当我们固定第一位和最后一位时,存在以下可能性。
1)第一位和最后一位相同,两边剩下的n-1位也应具有相同的总和。
2)第一位为1,最后一位为0,左侧剩余的n-1位之和应比右侧剩余的n-1位之和少1。
2)第1位为0和最后的位为1,其余的上左侧n-1个比特的总和应为1比右侧的总和n-1个位的更多。
基于以上事实,我们得到以下递推公式。
diff是前半个数字和后半个数字的总和之间的期望差。最初diff为0。
// When first and last bits are same
// there are two cases, 00 and 11
count(n, diff) = 2*count(n-1, diff) +
// When first bit is 1 and last bit is 0
count(n-1, diff-1) +
// When first bit is 0 and last bit is 1
count(n-1, diff+1)
What should be base cases?
// When n == 1 (2 bit sequences)
1) If n == 1 and diff == 0, return 2
2) If n == 1 and |diff| == 1, return 1
// We can't cover difference of more than n with 2n bits
3) If |diff| > n, return 0
下面是基于以上朴素递归解决方案的实现。
C++
// A Naive Recursive C++ program to count even
// length binary sequences such that the sum of
// first and second half bits is same
#include
using namespace std;
// diff is difference between sums first n bits
// and last n bits respectively
int countSeq(int n, int diff)
{
// We can't cover difference of more
// than n with 2n bits
if (abs(diff) > n)
return 0;
// n == 1, i.e., 2 bit long sequences
if (n == 1 && diff == 0)
return 2;
if (n == 1 && abs(diff) == 1)
return 1;
int res = // First bit is 0 & last bit is 1
countSeq(n-1, diff+1) +
// First and last bits are same
2*countSeq(n-1, diff) +
// First bit is 1 & last bit is 0
countSeq(n-1, diff-1);
return res;
}
// Driver program
int main()
{
int n = 2;
cout << "Count of sequences is "
<< countSeq(2, 0);
return 0;
}
Java
// A Naive Recursive Java program to
// count even length binary sequences
// such that the sum of first and
// second half bits is same
import java.io.*;
class GFG {
// diff is difference between sums
// first n bits and last n bits respectively
static int countSeq(int n, int diff)
{
// We can't cover difference of more
// than n with 2n bits
if (Math.abs(diff) > n)
return 0;
// n == 1, i.e., 2 bit long sequences
if (n == 1 && diff == 0)
return 2;
if (n == 1 && Math.abs(diff) == 1)
return 1;
int res = // First bit is 0 & last bit is 1
countSeq(n-1, diff+1) +
// First and last bits are same
2*countSeq(n-1, diff) +
// First bit is 1 & last bit is 0
countSeq(n-1, diff-1);
return res;
}
// Driver program
public static void main(String[] args)
{
int n = 2;
System.out.println("Count of sequences is "
+ countSeq(2, 0));
}
}
// This code is contributed by Prerna Saini
Python3
# A Naive Recursive Python
# program to count even length
# binary sequences such that
# the sum of first and second
# half bits is same
# diff is difference between
# sums first n bits and last
# n bits respectively
def countSeq(n, diff):
# We can't cover difference
# of more than n with 2n bits
if (abs(diff) > n):
return 0
# n == 1, i.e., 2
# bit long sequences
if (n == 1 and diff == 0):
return 2
if (n == 1 and abs(diff) == 1):
return 1
# First bit is 0 & last bit is 1
# First and last bits are same
# First bit is 1 & last bit is 0
res = (countSeq(n - 1, diff + 1) +
2 * countSeq(n - 1, diff) +
countSeq(n - 1, diff - 1))
return res
# Driver Code
n = 2;
print("Count of sequences is %d " %
(countSeq(2, 0)))
# This code is contributed
# by Shivi_Aggarwal
C#
// A Naive Recursive C# program to
// count even length binary sequences
// such that the sum of first and
// second half bits is same
using System;
class GFG {
// diff is difference between sums
// first n bits and last n bits
// respectively
static int countSeq(int n, int diff)
{
// We can't cover difference
// of more than n with 2n bits
if (Math.Abs(diff) > n)
return 0;
// n == 1, i.e., 2 bit long
// sequences
if (n == 1 && diff == 0)
return 2;
if (n == 1 && Math.Abs(diff) == 1)
return 1;
// 1. First bit is 0 & last bit is 1
// 2. First and last bits are same
// 3. First bit is 1 & last bit is 0
int res = countSeq(n-1, diff+1) +
2 * countSeq(n-1, diff) +
countSeq(n-1, diff-1);
return res;
}
// Driver program
public static void Main()
{
Console.Write("Count of sequences is "
+ countSeq(2, 0));
}
}
// This code is contributed by nitin mittal.
PHP
$n)
return 0;
// n == 1, i.e., 2
// bit long sequences
if ($n == 1 && $diff == 0)
return 2;
if ($n == 1 && abs($diff) == 1)
return 1;
$res = // First bit is 0 & last bit is 1
countSeq($n - 1, $diff + 1) +
// First and last bits are same
2 * countSeq($n - 1, $diff) +
// First bit is 1 & last bit is 0
countSeq($n - 1, $diff - 1);
return $res;
}
// Driver Code
$n = 2;
echo "Count of sequences is ",
countSeq($n, 0);
// This code is contributed
// by shiv_bhakt.
?>
Javascript
C++
// A memoization based C++ program to count even
// length binary sequences such that the sum of
// first and second half bits is same
#include
using namespace std;
#define MAX 1000
// A lookup table to store the results of subproblems
int lookup[MAX][MAX];
// dif is diference between sums of first n bits
// and last n bits i.e., dif = (Sum of first n bits) -
// (Sum of last n bits)
int countSeqUtil(int n, int dif)
{
// We can't cover diference of more
// than n with 2n bits
if (abs(dif) > n)
return 0;
// n == 1, i.e., 2 bit long sequences
if (n == 1 && dif == 0)
return 2;
if (n == 1 && abs(dif) == 1)
return 1;
// Check if this subbproblem is already solved
// n is added to dif to make sure index becomes
// positive
if (lookup[n][n+dif] != -1)
return lookup[n][n+dif];
int res = // First bit is 0 & last bit is 1
countSeqUtil(n-1, dif+1) +
// First and last bits are same
2*countSeqUtil(n-1, dif) +
// First bit is 1 & last bit is 0
countSeqUtil(n-1, dif-1);
// Store result in lookup table and return the result
return lookup[n][n+dif] = res;
}
// A Wrapper over countSeqUtil(). It mainly initializes lookup
// table, then calls countSeqUtil()
int countSeq(int n)
{
// Initialize all entries of lookup table as not filled
memset(lookup, -1, sizeof(lookup));
// call countSeqUtil()
return countSeqUtil(n, 0);
}
// Driver program
int main()
{
int n = 2;
cout << "Count of sequences is "
<< countSeq(2);
return 0;
}
Java
// A memoization based Java program to
// count even length binary sequences
// such that the sum of first and
// second half bits is same
import java.io.*;
class GFG {
// A lookup table to store the results of
// subproblems
static int lookup[][] = new int[1000][1000];
// dif is diference between sums of first
// n bits and last n bits i.e.,
// dif = (Sum of first n bits) - (Sum of last n bits)
static int countSeqUtil(int n, int dif)
{
// We can't cover diference of
// more than n with 2n bits
if (Math.abs(dif) > n)
return 0;
// n == 1, i.e., 2 bit long sequences
if (n == 1 && dif == 0)
return 2;
if (n == 1 && Math.abs(dif) == 1)
return 1;
// Check if this subbproblem is already
// solved n is added to dif to make
// sure index becomes positive
if (lookup[n][n+dif] != -1)
return lookup[n][n+dif];
int res = // First bit is 0 & last bit is 1
countSeqUtil(n-1, dif+1) +
// First and last bits are same
2*countSeqUtil(n-1, dif) +
// First bit is 1 & last bit is 0
countSeqUtil(n-1, dif-1);
// Store result in lookup table
// and return the result
return lookup[n][n+dif] = res;
}
// A Wrapper over countSeqUtil(). It mainly
// initializes lookup table, then calls
// countSeqUtil()
static int countSeq(int n)
{
// Initialize all entries of lookup
// table as not filled
// memset(lookup, -1, sizeof(lookup));
for(int k = 0; k < lookup.length; k++)
{
for(int j = 0; j < lookup.length; j++)
{
lookup[k][j] = -1;
}
}
// call countSeqUtil()
return countSeqUtil(n, 0);
}
// Driver program
public static void main(String[] args)
{
int n = 2;
System.out.println("Count of sequences is "
+ countSeq(2));
}
}
// This code is contributed by Prerna Saini
Python3
#A memoization based python program to count even
#length binary sequences such that the sum of
#first and second half bits is same
MAX=1000
#A lookup table to store the results of subproblems
lookup=[[0 for i in range(MAX)] for i in range(MAX)]
#dif is diference between sums of first n bits
#and last n bits i.e., dif = (Sum of first n bits) -
# (Sum of last n bits)
def countSeqUtil(n,dif):
#We can't cover diference of more
#than n with 2n bits
if abs(dif)>n:
return 0
#n == 1, i.e., 2 bit long sequences
if n==1 and dif==0:
return 2
if n==1 and abs(dif)==1:
return 1
#Check if this subbproblem is already solved
#n is added to dif to make sure index becomes
#positive
if lookup[n][n+dif]!=-1:
return lookup[n][n+dif]
#First bit is 0 & last bit is 1
#+First and last bits are same
#+First bit is 1 & last bit is 0
res= (countSeqUtil(n-1, dif+1)+
2*countSeqUtil(n-1, dif)+
countSeqUtil(n-1, dif-1))
#Store result in lookup table and return the result
lookup[n][n+dif]=res
return res
#A Wrapper over countSeqUtil(). It mainly initializes lookup
#table, then calls countSeqUtil()
def countSeq(n):
#Initialize all entries of lookup table as not filled
global lookup
lookup=[[-1 for i in range(MAX)] for i in range(MAX)]
#call countSeqUtil()
res=countSeqUtil(n,0)
return res
#Driver Code
if __name__=='__main__':
n=2
print('Count of Sequences is ',countSeq(n))
#This Code is contributed by sahilshelangia
C#
// A memoization based C# program to
// count even length binary sequences
// such that the sum of first and
// second half bits is same
using System;
class GFG {
// A lookup table to store the results of
// subproblems
static int [,]lookup = new int[1000,1000];
// dif is diference between sums of first
// n bits and last n bits i.e.,
// dif = (Sum of first n bits) - (Sum of last n bits)
static int countSeqUtil(int n, int dif)
{
// We can't cover diference of
// more than n with 2n bits
if (Math.Abs(dif) > n)
return 0;
// n == 1, i.e., 2 bit long sequences
if (n == 1 && dif == 0)
return 2;
if (n == 1 && Math.Abs(dif) == 1)
return 1;
// Check if this subbproblem is already
// solved n is added to dif to make
// sure index becomes positive
if (lookup[n,n+dif] != -1)
return lookup[n,n+dif];
int res = // First bit is 0 & last bit is 1
countSeqUtil(n-1, dif+1) +
// First and last bits are same
2*countSeqUtil(n-1, dif) +
// First bit is 1 & last bit is 0
countSeqUtil(n-1, dif-1);
// Store result in lookup table
// and return the result
return lookup[n,n+dif] = res;
}
// A Wrapper over countSeqUtil(). It mainly
// initializes lookup table, then calls
// countSeqUtil()
static int countSeq(int n)
{
// Initialize all entries of lookup
// table as not filled
// memset(lookup, -1, sizeof(lookup));
for(int k = 0; k < lookup.GetLength(0); k++)
{
for(int j = 0; j < lookup.GetLength(1); j++)
{
lookup[k,j] = -1;
}
}
// call countSeqUtil()
return countSeqUtil(n, 0);
}
// Driver program
public static void Main()
{
int n = 2;
Console.WriteLine("Count of sequences is "
+ countSeq(n));
}
}
// This code is contributed by Ryuga
PHP
$n)
return 0;
// n == 1, i.e., 2 bit long sequences
if ($n == 1 && $dif == 0)
return 2;
if ($n == 1 && abs($dif) == 1)
return 1;
// Check if this subbproblem is already solved
// n is added to dif to make sure index becomes
// positive
if ($lookup[$n][$n + $dif] != -1)
return $lookup[$n][$n + $dif];
$res = // First bit is 0 & last bit is 1
countSeqUtil($n - 1, $dif + 1) +
// First and last bits are same
2 * countSeqUtil($n - 1, $dif) +
// First bit is 1 & last bit is 0
countSeqUtil($n - 1, $dif - 1);
// Store result in lookup table and return the result
return $lookup[$n][$n + $dif] = $res;
}
// A Wrapper over countSeqUtil(). It mainly
// initializes lookup table, then calls countSeqUtil()
function countSeq($n)
{
// Initialize all entries of
// lookup table as not filled
// call countSeqUtil()
return countSeqUtil($n, 0);
}
// Driver Code
$n = 2;
echo "Count of sequences is " . countSeq($n);
// This code is contributed by mits
?>
Javascript
C++
// A O(n) C++ program to count even length binary sequences
// such that the sum of first and second half bits is same
#include
using namespace std;
// Returns the count of even length sequences
int countSeq(int n)
{
int nCr=1, res = 1;
// Calculate SUM ((nCr)^2)
for (int r = 1; r<=n ; r++)
{
// Compute nCr using nC(r-1)
// nCr/nC(r-1) = (n+1-r)/r;
nCr = (nCr * (n+1-r))/r;
res += nCr*nCr;
}
return res;
}
// Driver program
int main()
{
int n = 2;
cout << "Count of sequences is "
<< countSeq(n);
return 0;
}
Java
// Java program to find remaining
// chocolates after k iterations
class GFG
{
// A O(n) C++ program to count
// even length binary sequences
// such that the sum of first
// and second half bits is same
// Returns the count of
// even length sequences
static int countSeq(int n)
{
int nCr = 1, res = 1;
// Calculate SUM ((nCr)^2)
for (int r = 1; r <= n ; r++)
{
// Compute nCr using nC(r-1)
// nCr/nC(r-1) = (n+1-r)/r;
nCr = (nCr * (n + 1 - r)) / r;
res += nCr * nCr;
}
return res;
}
// Driver code
public static void main(String args[])
{
int n = 2;
System.out.print("Count of sequences is ");
System.out.println(countSeq(n));
}
}
// This code is contributed
// by Shivi_Aggarwal
Python
# A Python program to count
# even length binary sequences
# such that the sum of first
# and second half bits is same
# Returns the count of
# even length sequences
def countSeq(n):
nCr = 1
res = 1
# Calculate SUM ((nCr)^2)
for r in range(1, n + 1):
# Compute nCr using nC(r-1)
# nCr/nC(r-1) = (n+1-r)/r;
nCr = (nCr * (n + 1 - r)) / r;
res += nCr * nCr;
return res;
# Driver Code
n = 2
print("Count of sequences is"),
print (int(countSeq(n)))
# This code is contributed
# by Shivi_Aggarwal
C#
// C# program to find remaining
// chocolates after k iteration
using System;
class GFG {
// A O(n) C# program to count
// even length binary sequences
// such that the sum of first
// and second half bits is same
// Returns the count of
// even length sequences
static int countSeq(int n)
{
int nCr = 1, res = 1;
// Calculate SUM ((nCr)^2)
for (int r = 1; r <= n ; r++)
{
// Compute nCr using nC(r-1)
// nCr/nC(r-1) = (n+1-r)/r;
nCr = (nCr * (n + 1 - r)) / r;
res += nCr * nCr;
}
return res;
}
// Driver code
public static void Main()
{
int n = 2;
Console.Write("Count of sequences is ");
Console.Write(countSeq(n));
}
}
// This code is contributed
// by ChitraNayal
PHP
输出:
Count of sequences is 6
上述解决方案的时间复杂度是指数的。如果绘制完整的递归树,则可以观察到许多子问题一次又一次地得到解决。例如,当我们从n = 4开始并且diff = 0时,我们可以通过多条路径达到(3,0)。由于再次调用了相同的问题,因此此问题具有“重叠子问题”属性。因此,最小平方和问题具有动态规划问题的两个属性(请参阅此内容)。
下面是一个基于备忘录的解决方案,它使用查找表来计算结果。
C++
// A memoization based C++ program to count even
// length binary sequences such that the sum of
// first and second half bits is same
#include
using namespace std;
#define MAX 1000
// A lookup table to store the results of subproblems
int lookup[MAX][MAX];
// dif is diference between sums of first n bits
// and last n bits i.e., dif = (Sum of first n bits) -
// (Sum of last n bits)
int countSeqUtil(int n, int dif)
{
// We can't cover diference of more
// than n with 2n bits
if (abs(dif) > n)
return 0;
// n == 1, i.e., 2 bit long sequences
if (n == 1 && dif == 0)
return 2;
if (n == 1 && abs(dif) == 1)
return 1;
// Check if this subbproblem is already solved
// n is added to dif to make sure index becomes
// positive
if (lookup[n][n+dif] != -1)
return lookup[n][n+dif];
int res = // First bit is 0 & last bit is 1
countSeqUtil(n-1, dif+1) +
// First and last bits are same
2*countSeqUtil(n-1, dif) +
// First bit is 1 & last bit is 0
countSeqUtil(n-1, dif-1);
// Store result in lookup table and return the result
return lookup[n][n+dif] = res;
}
// A Wrapper over countSeqUtil(). It mainly initializes lookup
// table, then calls countSeqUtil()
int countSeq(int n)
{
// Initialize all entries of lookup table as not filled
memset(lookup, -1, sizeof(lookup));
// call countSeqUtil()
return countSeqUtil(n, 0);
}
// Driver program
int main()
{
int n = 2;
cout << "Count of sequences is "
<< countSeq(2);
return 0;
}
Java
// A memoization based Java program to
// count even length binary sequences
// such that the sum of first and
// second half bits is same
import java.io.*;
class GFG {
// A lookup table to store the results of
// subproblems
static int lookup[][] = new int[1000][1000];
// dif is diference between sums of first
// n bits and last n bits i.e.,
// dif = (Sum of first n bits) - (Sum of last n bits)
static int countSeqUtil(int n, int dif)
{
// We can't cover diference of
// more than n with 2n bits
if (Math.abs(dif) > n)
return 0;
// n == 1, i.e., 2 bit long sequences
if (n == 1 && dif == 0)
return 2;
if (n == 1 && Math.abs(dif) == 1)
return 1;
// Check if this subbproblem is already
// solved n is added to dif to make
// sure index becomes positive
if (lookup[n][n+dif] != -1)
return lookup[n][n+dif];
int res = // First bit is 0 & last bit is 1
countSeqUtil(n-1, dif+1) +
// First and last bits are same
2*countSeqUtil(n-1, dif) +
// First bit is 1 & last bit is 0
countSeqUtil(n-1, dif-1);
// Store result in lookup table
// and return the result
return lookup[n][n+dif] = res;
}
// A Wrapper over countSeqUtil(). It mainly
// initializes lookup table, then calls
// countSeqUtil()
static int countSeq(int n)
{
// Initialize all entries of lookup
// table as not filled
// memset(lookup, -1, sizeof(lookup));
for(int k = 0; k < lookup.length; k++)
{
for(int j = 0; j < lookup.length; j++)
{
lookup[k][j] = -1;
}
}
// call countSeqUtil()
return countSeqUtil(n, 0);
}
// Driver program
public static void main(String[] args)
{
int n = 2;
System.out.println("Count of sequences is "
+ countSeq(2));
}
}
// This code is contributed by Prerna Saini
Python3
#A memoization based python program to count even
#length binary sequences such that the sum of
#first and second half bits is same
MAX=1000
#A lookup table to store the results of subproblems
lookup=[[0 for i in range(MAX)] for i in range(MAX)]
#dif is diference between sums of first n bits
#and last n bits i.e., dif = (Sum of first n bits) -
# (Sum of last n bits)
def countSeqUtil(n,dif):
#We can't cover diference of more
#than n with 2n bits
if abs(dif)>n:
return 0
#n == 1, i.e., 2 bit long sequences
if n==1 and dif==0:
return 2
if n==1 and abs(dif)==1:
return 1
#Check if this subbproblem is already solved
#n is added to dif to make sure index becomes
#positive
if lookup[n][n+dif]!=-1:
return lookup[n][n+dif]
#First bit is 0 & last bit is 1
#+First and last bits are same
#+First bit is 1 & last bit is 0
res= (countSeqUtil(n-1, dif+1)+
2*countSeqUtil(n-1, dif)+
countSeqUtil(n-1, dif-1))
#Store result in lookup table and return the result
lookup[n][n+dif]=res
return res
#A Wrapper over countSeqUtil(). It mainly initializes lookup
#table, then calls countSeqUtil()
def countSeq(n):
#Initialize all entries of lookup table as not filled
global lookup
lookup=[[-1 for i in range(MAX)] for i in range(MAX)]
#call countSeqUtil()
res=countSeqUtil(n,0)
return res
#Driver Code
if __name__=='__main__':
n=2
print('Count of Sequences is ',countSeq(n))
#This Code is contributed by sahilshelangia
C#
// A memoization based C# program to
// count even length binary sequences
// such that the sum of first and
// second half bits is same
using System;
class GFG {
// A lookup table to store the results of
// subproblems
static int [,]lookup = new int[1000,1000];
// dif is diference between sums of first
// n bits and last n bits i.e.,
// dif = (Sum of first n bits) - (Sum of last n bits)
static int countSeqUtil(int n, int dif)
{
// We can't cover diference of
// more than n with 2n bits
if (Math.Abs(dif) > n)
return 0;
// n == 1, i.e., 2 bit long sequences
if (n == 1 && dif == 0)
return 2;
if (n == 1 && Math.Abs(dif) == 1)
return 1;
// Check if this subbproblem is already
// solved n is added to dif to make
// sure index becomes positive
if (lookup[n,n+dif] != -1)
return lookup[n,n+dif];
int res = // First bit is 0 & last bit is 1
countSeqUtil(n-1, dif+1) +
// First and last bits are same
2*countSeqUtil(n-1, dif) +
// First bit is 1 & last bit is 0
countSeqUtil(n-1, dif-1);
// Store result in lookup table
// and return the result
return lookup[n,n+dif] = res;
}
// A Wrapper over countSeqUtil(). It mainly
// initializes lookup table, then calls
// countSeqUtil()
static int countSeq(int n)
{
// Initialize all entries of lookup
// table as not filled
// memset(lookup, -1, sizeof(lookup));
for(int k = 0; k < lookup.GetLength(0); k++)
{
for(int j = 0; j < lookup.GetLength(1); j++)
{
lookup[k,j] = -1;
}
}
// call countSeqUtil()
return countSeqUtil(n, 0);
}
// Driver program
public static void Main()
{
int n = 2;
Console.WriteLine("Count of sequences is "
+ countSeq(n));
}
}
// This code is contributed by Ryuga
的PHP
$n)
return 0;
// n == 1, i.e., 2 bit long sequences
if ($n == 1 && $dif == 0)
return 2;
if ($n == 1 && abs($dif) == 1)
return 1;
// Check if this subbproblem is already solved
// n is added to dif to make sure index becomes
// positive
if ($lookup[$n][$n + $dif] != -1)
return $lookup[$n][$n + $dif];
$res = // First bit is 0 & last bit is 1
countSeqUtil($n - 1, $dif + 1) +
// First and last bits are same
2 * countSeqUtil($n - 1, $dif) +
// First bit is 1 & last bit is 0
countSeqUtil($n - 1, $dif - 1);
// Store result in lookup table and return the result
return $lookup[$n][$n + $dif] = $res;
}
// A Wrapper over countSeqUtil(). It mainly
// initializes lookup table, then calls countSeqUtil()
function countSeq($n)
{
// Initialize all entries of
// lookup table as not filled
// call countSeqUtil()
return countSeqUtil($n, 0);
}
// Driver Code
$n = 2;
echo "Count of sequences is " . countSeq($n);
// This code is contributed by mits
?>
Java脚本
输出:
Count of sequences is 6
最坏的情况是此解决方案的时间复杂度为O(n 2 ),因为diff可以最大为n。
下面是相同的O(n)解决方案。
Number of n-bit strings with 0 ones = nC0
Number of n-bit strings with 1 ones = nC1
...
Number of n-bit strings with k ones = nCk
...
Number of n-bit strings with n ones = nCn
因此,我们可以使用以下方法获得所需的结果
No. of 2*n bit strings such that first n bits have 0 ones &
last n bits have 0 ones = nC0 * nC0
No. of 2*n bit strings such that first n bits have 1 ones &
last n bits have 1 ones = nC1 * nC1
....
and so on.
Result = nC0*nC0 + nC1*nC1 + ... + nCn*nCn
= ∑(nCk)2
0 <= k <= n
下面是基于以上思想的实现。
C++
// A O(n) C++ program to count even length binary sequences
// such that the sum of first and second half bits is same
#include
using namespace std;
// Returns the count of even length sequences
int countSeq(int n)
{
int nCr=1, res = 1;
// Calculate SUM ((nCr)^2)
for (int r = 1; r<=n ; r++)
{
// Compute nCr using nC(r-1)
// nCr/nC(r-1) = (n+1-r)/r;
nCr = (nCr * (n+1-r))/r;
res += nCr*nCr;
}
return res;
}
// Driver program
int main()
{
int n = 2;
cout << "Count of sequences is "
<< countSeq(n);
return 0;
}
Java
// Java program to find remaining
// chocolates after k iterations
class GFG
{
// A O(n) C++ program to count
// even length binary sequences
// such that the sum of first
// and second half bits is same
// Returns the count of
// even length sequences
static int countSeq(int n)
{
int nCr = 1, res = 1;
// Calculate SUM ((nCr)^2)
for (int r = 1; r <= n ; r++)
{
// Compute nCr using nC(r-1)
// nCr/nC(r-1) = (n+1-r)/r;
nCr = (nCr * (n + 1 - r)) / r;
res += nCr * nCr;
}
return res;
}
// Driver code
public static void main(String args[])
{
int n = 2;
System.out.print("Count of sequences is ");
System.out.println(countSeq(n));
}
}
// This code is contributed
// by Shivi_Aggarwal
Python
# A Python program to count
# even length binary sequences
# such that the sum of first
# and second half bits is same
# Returns the count of
# even length sequences
def countSeq(n):
nCr = 1
res = 1
# Calculate SUM ((nCr)^2)
for r in range(1, n + 1):
# Compute nCr using nC(r-1)
# nCr/nC(r-1) = (n+1-r)/r;
nCr = (nCr * (n + 1 - r)) / r;
res += nCr * nCr;
return res;
# Driver Code
n = 2
print("Count of sequences is"),
print (int(countSeq(n)))
# This code is contributed
# by Shivi_Aggarwal
C#
// C# program to find remaining
// chocolates after k iteration
using System;
class GFG {
// A O(n) C# program to count
// even length binary sequences
// such that the sum of first
// and second half bits is same
// Returns the count of
// even length sequences
static int countSeq(int n)
{
int nCr = 1, res = 1;
// Calculate SUM ((nCr)^2)
for (int r = 1; r <= n ; r++)
{
// Compute nCr using nC(r-1)
// nCr/nC(r-1) = (n+1-r)/r;
nCr = (nCr * (n + 1 - r)) / r;
res += nCr * nCr;
}
return res;
}
// Driver code
public static void Main()
{
int n = 2;
Console.Write("Count of sequences is ");
Console.Write(countSeq(n));
}
}
// This code is contributed
// by ChitraNayal
的PHP
输出:
Count of sequences is 6