poj3252
5296 ワード
#include <iostream>
#define Ni 50
using namespace std;
int c[Ni][Ni];
int big[Ni];
int C(int n,int m)//c(n,m)=c(n-1,m)+c(n-1,m-1)
{
if(c[n][m]!=-1) return c[n][m];
if(n<m) return 0;
if(n==m) return 1;
c[n-1][m]=C(n-1,m);
c[n-1][m-1]=C(n-1,m-1);
return c[n][m]=c[n-1][m]+c[n-1][m-1];
}
void Init()
{
int i,j,n;
memset(c,-1,sizeof(c));
n=34;
for(i=0;i<n;i++)
for(j=0;j<=n;j++)
C(i,j);
}
int cacu(int n)
{
int ans=0,m=n,t=0;
int i,j;
while(m) {m=(m>>1);t++;}
for(i=t-2;i>=1;i--)
{
for(j=i;j>i/2;j--)
ans+=c[i][j];
}
int num0=0;
for(i=t-2;i>=0;i--)
{
if( (n&(1<<i)) )
{
for(j=(t+1)/2-num0-1;j<=i;j++)
ans+=c[i][j];
}
else
{
num0++;
}
}//cout<<ans<<endl;
return ans;
}
int main()
{
int l,r,ansl,ansr;
Init();
while(cin>>l>>r)
{
ansl=cacu(l);
ansr=cacu(r+1);
cout<<ansr-ansl<<endl;
}
return 0;
}