#include <bits/stdc++.h>
#define _for(i, a, b) for (int i = (a); i < (int)(b); ++i)
using namespace std;
using LL = long long;
using VL = vector<LL>;
const int P = 1e9 + 7;
struct Mat {
int m, n;
vector<VL> F;
Mat(int _n, int _m) : n(_n), m(_m), F(n, VL(m)) {}
Mat operator * (const Mat& x) const {
Mat ans(n, x.m);
_for(r, 0, n) _for(c, 0, x.m) _for(i, 0, m)
(ans.F[r][c] += F[r][i] * x.F[i][c] % P) %= P;
return ans;
}
Mat operator ^ (LL k) const {
Mat ans = *this, p = *this;
for (--k; k; k >>= 1, p = p * p)
if (k & 1) ans = ans * p;
return ans;
}
};
int main(void) {
ios::sync_with_stdio(false), cin.tie(0);
LL n, k; cin >> n >> k, k--;
vector<LL> A(n);
for (LL& a : A) cin >> a;
if (k == 0) { cout << n << "\n"; return 0; }
Mat G(n, n), F(n, 1);
_for(i, 0, n) _for(j, 0, n)
G.F[i][j] = __builtin_popcountll(A[i] ^ A[j]) % 3 == 0;
_for(i, 0, n) F.F[i][0] = 1;
F = (G ^ k) * F;
LL ans = 0;
_for(i, 0, n) (ans += F.F[i][0]) %= P;
cout << ans << "\n";
return 0;
}
1183A - Nearest Interesting Number | 1009E - Intercity Travelling |
1637B - MEX and Array | 224A - Parallelepiped |
964A - Splits | 1615A - Closing The Gap |
4C - Registration System | 1321A - Contest for Robots |
1451A - Subtract or Divide | 1B - Spreadsheet |
1177A - Digits Sequence (Easy Edition) | 1579A - Casimir's String Solitaire |
287B - Pipeline | 510A - Fox And Snake |
1520B - Ordinary Numbers | 1624A - Plus One on the Subset |
350A - TL | 1487A - Arena |
1520D - Same Differences | 376A - Lever |
1305A - Kuroni and the Gifts | 1609A - Divide and Multiply |
149B - Martian Clock | 205A - Little Elephant and Rozdil |
1609B - William the Vigilant | 978B - File Name |
1426B - Symmetric Matrix | 732B - Cormen --- The Best Friend Of a Man |
1369A - FashionabLee | 1474B - Different Divisors |