rt.
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <random>
#include <ctime>
#include <map>
#include <queue>
#define int long long
using namespace std;
const int md=1e9+7;
void read(int &x){
x=0;
int f=1;
char c=getchar();
while(!('0'<=c && c<='9')){
if(c=='-'){
f=-1;
}
c=getchar();
}
while('0'<=c && c<='9'){
x=(x<<3)+(x<<1)+(c^48);
c=getchar();
}
x*=f;
}
int n,k,a[100010],b[100010],cnt=0;
map<vector<int>,int> mp;
map<int,int> diff[100010];
pair<int,int> ps[100010];
int getlw(int l,int r,int k){
if(l==-1){
return 0;
}
return __builtin_popcount(l&((1ll<<k)-(1ll<<__lg(l^r))))+1;
}
vector<int> gethsh(){
vector<int> res;
for(int i=2;i<=n;i++){
res.push_back(b[i]-b[i-1]);
}
return res;
}
signed main(){
read(n);
read(k);
for(int i=1;i<=n;i++){
read(a[i]);
}
for(int i=0;i<=min(60ll,k);i++){
int mn=4e18;
for(int j=1;j<=n;j++){
ps[j]=make_pair(a[j]&((1ll<<i)-1),j);
mn=min(mn,b[j]=a[j]>>i);
}
sort(ps+1,ps+n+1);
ps[0]=make_pair(-1ll,0ll);
ps[n+1]=make_pair((1ll<<i)-1,0ll);
for(int j=0;j<=n;j++){
if(ps[j].second){
mn=min(mn,--b[ps[j].second]);
}
if(mn<0){
break;
}
if(ps[j].first!=ps[j+1].first){
auto h=gethsh();
if(mp.find(h)==mp.end()){
mp[h]=++cnt;
}
int cur=mp[h],tp=min(mn,k-i-getlw(ps[j].first,ps[j+1].first,i));
//printf("[%lld %lld %lld %lld]\n",i,ps[j].first,ps[j+1].first,getlw(ps[j].first,ps[j+1].first,i));
if(tp>=0){
diff[cur][b[1]+1]--;
diff[cur][b[1]-tp]++;
}
}
}
}sqrt^4(nq/4)
int res=0;
for(auto i:mp){
int cnt=0,lst=0;
for(auto j:diff[i.second]){
//printf("[%lld %lld]",j.first,j.second);
if(cnt){
res=(res+j.first-lst)%md;
}
lst=j.first;
cnt+=j.second;
}
//putchar('\n');
}
printf("%lld",res%md);
return 0;
}