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();
}