691E - Xor-sequences - CodeForces Solution


matrices *1900

Please click on ads to support us..

C++ Code:

#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;
} 
  	 	   		     				  		  		 			


Comments

Submit
0 Comments
More Questions

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