#include<bits/stdc++.h>
using namespace std;
const long long md=1e9+7;
const int maxn=310;
const long long INF=1e18+10;
void chkmin(long long &x,long long y){
	x=x<y?x:y;
}
void chkmax(long long &x,long long y){
	x=x>y?x:y;
}
long long Max(long long x,long long y){
	return x>y?x:y;
}
struct node{
	long long v,r;
}b[maxn];
struct Range{
	long long l,r;
};
bool cmp(const node &A,const node &B){
	return A.r<B.r;
}
bool cmpl(const Range &A,const Range &B){
	return A.l<B.l;
}
long long a[maxn];
long long val[maxn*61][maxn];
int num;
map<vector<long long>,vector<Range> > mp;
map<vector<long long>,vector<Range> >::iterator it;
long long d[maxn];
long long getmnv(long long l,long long r){
	if(l>r) return INF;
	int mnv=0;
	for(int j=59;j>=0;j--){
		if((l&(1LL<<j))==(r&(1LL<<j))) mnv+=(l>>j)&1;
		else{
			if(l&((1LL<<j)-1)) mnv++;
			break;
		}
	}
	return mnv;
}
void Add(int n,int p,long long K){
	if(K<0) return;
	long long Mn=b[1].v-(1<=p);
	vector<long long> vec;
	vec.resize(n);
	for(int i=1;i<=n;i++){
		vec[i-1]=b[i].v-(i<=p);
		if(d[i]<0) return;
		chkmin(Mn,vec[i-1]);
	}
	for(int i=1;i<=n;i++)
		vec[i-1]-=Mn;
	Range st=(Range){Max(Mn-K,0),Mn};
	sort(vec.begin(),vec.end());
	mp[vec].push_back(st);
}
int main(){
//	freopen("F.in","r",stdin);
	int n;
	long long K;
	scanf("%d%lld",&n,&K);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	int nxt;
	long long l,r;
	for(int k=0;k<=60;k++){
		for(int i=1;i<=n;i++){
			b[i].v=a[i]>>k;
			b[i].r=a[i]&((1LL<<k)-1);
		}
		sort(b+1,b+n+1,cmp);
		l=0;
		for(int i=1;i<=n;i=nxt+1,l=r+1){
			nxt=i;
			while(nxt<n&&b[nxt+1].r==b[i].r) nxt++;
			r=b[i].r;
			Add(n,i-1,K-getmnv(l,r)-k);
		}
	}
	long long ans=0;
	vector<Range> vec;
	for(it=mp.begin();it!=mp.end();it++){
		vec=it->second;
		l=-1,r=-2;
		for(int j=0;j<(int)vec.size();j++){
			if(vec[j].l>r){
				ans=(ans+((r-l+1)%md))%md;
				l=vec[j].l,r=vec[j].r;
			}
			else chkmax(r,vec[j].r);
		}
		ans=(ans+((r-l+1)%md))%md;
	}
	printf("%lld\n",ans);
	return 0;
}
