记录编号 119933 评测结果 AAAAAAAAAA
题目名称 [HNOI 2012]与非 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.016 s
提交时间 2014-09-14 20:24:46 内存使用 0.32 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
const int SIZEN=1010,SIZEK=70;
LL N,K,L,R;
LL A[SIZEN]={0};
int comp[SIZEK]={0};//这一位跟谁一样
int dif[SIZEK]={0};
int d[SIZEK]={0};
int vis[SIZEK]={0};
inline int getdig(LL x,int t){
	return (x>>t)&1;
}
void prepare(void){
	int tot=0;
	for(int i=0;i<K;i++){
		if(!comp[i]){
			comp[i]=++tot;
			for(int j=i+1;j<K;j++){
				if(!comp[j]){
					int k;
					for(k=1;k<=N;k++) if(getdig(A[k],i)!=getdig(A[k],j)) break;
					if(k>N) comp[j]=tot;
				}
			}
		}
	}
	d[0]=1,vis[comp[0]]=true;
	for(int i=1;i<K;i++){
		if(!vis[comp[i]]){
			vis[comp[i]]=true;
			d[i]=d[i-1]+1;
		}
		else d[i]=d[i-1];
	}
}
LL calc(LL x){
	if(x<0) return 0;
	if(x>(1LL<<K)) x=(1LL<<K)-1;
	memset(vis,0,sizeof(vis));
	memcpy(dif,d,sizeof(d));
	LL ans=0;
	int i;
	for(i=K-1;i>=0;i--){
		if(!vis[comp[i]]){
			if(getdig(x,i)){
				ans+=1LL<<(dif[i]-1);
				vis[comp[i]]=2;
			}
			else vis[comp[i]]=1;
			int j;
			for(j=0;comp[j]!=comp[i];j++);
			for(;j<i;j++) dif[j]--;
		}
		else if(vis[comp[i]]==1&&getdig(x,i)){
			ans+=1LL<<dif[i];
			break;
		}
		else if(vis[comp[i]]==2&&!getdig(x,i)) break;
	}
	if(i<0) ans++;
	return ans;
}
int main(){
	freopen("bzoj_2728.in","r",stdin);
	freopen("bzoj_2728.out","w",stdout);
	scanf("%lld%lld%lld%lld",&N,&K,&L,&R);
	for(int i=1;i<=N;i++) scanf("%lld",&A[i]);
	prepare();
	printf("%lld\n",calc(R)-calc(L-1));
	return 0;
}