// Original C++ solution (slower):
#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;

vector<Range> c[maxn*61];

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;

}

bool equl(long long *A,long long *B,int n){

	for(int i=1;i<=n;i++)

		if(A[i]!=B[i])

			return 0;

	return 1;

}

void Add(int n,int p,long long K){

	if(K<0) return;

	long long Mn=b[1].v-(1<=p);

	for(int i=1;i<=n;i++){

		d[i]=b[i].v-(i<=p);

		if(d[i]<0) return;

		chkmin(Mn,d[i]);

	}

	for(int i=1;i<=n;i++)

		d[i]-=Mn;

	Range st=(Range){Max(Mn-K,0),Mn};

	sort(d+1,d+n+1);

	for(int i=1;i<=num;i++){

		if(equl(d,val[i],n)){

			c[i].push_back(st);

			return;

		}

	}

	num++;

	for(int i=1;i<=n;i++)

		val[num][i]=d[i];

	c[num].push_back(st);

}

int main(){

	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;

	for(int i=1;i<=num;i++){

		sort(c[i].begin(),c[i].end(),cmpl);

		l=-2,r=-3;

		for(int j=0;j<(int)c[i].size();j++){

			if(c[i][j].l>r){

				ans=(ans+((r-l+1)%md))%md;

				l=c[i][j].l,r=c[i][j].r;

			}

			else chkmax(r,c[i][j].r);

		}

		ans=(ans+((r-l+1)%md))%md;

	}

	printf("%lld\n",ans);

	return 0;

}


// Optimized solution to the same problem (faster):
#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;

}


// Fastest known solution for this problem: