poj3252

#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;
}
原文地址:https://www.cnblogs.com/qijinbiao/p/2494338.html