BINARY - Số nhị phân có nghĩa

Tác giả: hieult

Ngôn ngữ: C++

#include <stdio.h>
//#include <conio.h>
main()
{
long C[34][34],a[34],n,k;
for(long i=0;i<=32;i++)
  for(long j=0;j<=32;j++)
    C[i][j]=0;
for(long i=0;i<=32;i++)
  C[0][i]=1;
for(long i=1;i<=32;i++)
  for(long j=1;j<=i;j++)
    {
    C[j][i]=C[j][i-1]+C[j-1][i-1];
    //printf("%ld ",C[j][i]);
    }  
//printf("%ld %ld %ld",C[14][32],C[32][32],C[16][32]);    
while(scanf("%ld %ld",&n,&k)>0)
  {
  long dem=0;
  long KQ=0;
  long t=0;               
  while(n!=0)
    {
    t++;
    a[t]=n%2;
    n=n/2;
    }
  if((k>=t&&k!=1)||k<0)
    printf("0\n");
  else
  {    
  for(long i=t-2;i>=k;i--)
    KQ=KQ+C[k][i];
  for(long i=t-1;i>=1;i--)
    if(a[i]==1)
      {
      if(k-t+i+dem>=0)
        {
        KQ=KQ+C[k-t+i+dem][i-1];
        //printf("%ld %ld %ld %ld",k,t,i,dem);
        }
      dem++;
      }
  if(t-dem-1==k)
  KQ++;
  if(k==1)
  KQ++;    
  printf("%ld\n",KQ);
  }
  }
//getch();
}          
                   
    

Download