POJ3252

来源:互联网 发布:福建广电网络 泉州 编辑:程序博客网 时间:2024/04/29 19:12
排列组合。。。

做了好久

#include<cstdio>using namespace std;typedef long long ll;ll a,b,ans;int stack[100],top;ll c(int n,int m){if(m==0){return 1;}ll max=1;ll min=1;if(m>n-m)m=n-m;while(m>0){max*=n--;min*=m--;}return max/min;}void init(ll x){top=0;while(x){if(x%2){stack[top++]=1;}else{stack[top++]=0;}x/=2;}}ll lb(int n0,int n1,int p)  //0有n0个 1有n1个 可选择0~p{ll sum=0;int i;for(i=0;i<=p;i++){if(n0+i>=n1+p-i){sum+=c(p,i);}}return sum;}ll fun(ll x,bool &ba){init(x);int i,n0,n1;n0=n1=0;ll sum=0;while(top){top--;if(stack[top]==1){n1++;if(n1+n0==1){for(i=1;i<top;i++){sum+=lb(0,1,i);}}else{sum+=lb(n0+1,n1-1,top);}}else{n0++;}}if(n0>=n1){sum++;ba=true;}return sum;}void cal(){bool ba,bb;ans=fun(b,bb)-fun(a,ba);if(ba){ans++;}}void answer(){printf("%lld\n",ans);}int main(){while(~scanf("%lld%lld",&a,&b)){cal();answer();}return 0;}