#include <iostream>
#include <vector>
#include <map>
#include <utility>
#include <algorithm>
#define llint long long
#define inf 2e18
#define mod 1000000007

using namespace std;
typedef pair<llint, llint> P;

llint n, K;
llint a[205], b[205];
map<vector<llint>, vector<P>> mp;

llint get(llint l, llint r)
{
	if(l <= 0) return 0;
	llint ret = 0;
	for(int i = 60; i >= 0; i--){
		if( (l&(1LL<<i)) != (r&(1LL<<i)) ){
			if(l > ret) ret += (1LL<<i);
			return ret;
		}
		ret += (l&(1LL<<i));
	}
	return ret;
}
llint count(llint x)
{
	llint ret = 0;
	for(;x;x>>=1) ret += x&1LL;
	return ret;
}

int main(void)
{
	cin >> n >> K;
	for(int i = 1; i <= n; i++) cin >> a[i];
	
	llint lim = inf;
	for(int i = 1; i <= n; i++) lim = min(lim, a[i]);
	
	vector<llint> vec;
	for(int i = 0; i <= min(K, 60LL); i++){
		llint R = (1LL<<i);
		vec.clear();
		for(int j = 1; j <= n; j++) vec.push_back(a[j]%R);
		vec.push_back(-1), vec.push_back(R-1);
		sort(vec.begin(), vec.end());
		vec.erase(unique(vec.begin(), vec.end()), vec.end());
		
		//cout << "i = " << i << endl;
		//for(int j = 0; j < vec.size(); j++) cout << vec[j] << " "; cout << endl;
		
		for(int j = 0; j < vec.size(); j++){
			if(vec[j] >= min(lim, R-1)) continue;
			for(int k = 1; k <= n; k++){
				b[k] = a[k];
				b[k] >>= i;
				if(a[k]%R <= vec[j]) b[k]--;
			}
			
			llint mn = inf;
			for(int k = 1; k <= n; k++){
				mn = min(mn, b[k]);
			}
			vector<llint> sig;
			for(int k = 1; k <= n; k++) sig.push_back(b[k]-mn);
			llint bit = count(get(vec[j]+1, min(lim, vec[j+1])));
			llint rem = K - i - bit;
			
			if(rem < 0) continue;
			mp[sig].push_back(make_pair(b[1] - min(mn, rem), 0));
			mp[sig].push_back(make_pair(b[1], 1));
			
			/*cout << "\tj = " << j << endl;
			cout << "\t";
			for(int k = 0; k < sig.size(); k++) cout << sig[k] << " "; cout << endl;
			cout << "\t" << b[1] << " " << rem << " " << mn << endl;*/
		}
	}
	
	llint ans = 0;
	for(auto it = mp.begin(); it != mp.end(); it++){
		sort(it->second.begin(), it->second.end());
		
		/*for(int i = 0; i < it->second.size(); i++){
			cout << it->second[i].first << " " << it->second[i].second << " ";
		}
		cout << endl;*/
		
		llint num = 0, pre;
		for(int i = 0; i < it->second.size(); i++){
			P r = it->second[i];
			if(r.second == 0){
				if(num == 0) pre = r.first;
				num++;
			}
			else{
				num--;
				if(num == 0){
					ans += (r.first - pre + 1) % mod;
					ans %= mod;
				}
			}
		}
	}
	cout << ans << endl;
	
	return 0;
}