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;

}