Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- // не содержат ли столбцы полные квадраты? (закрашенные или пустые)
- bool possible(int a, int b, int m) {
- for(int i = 0; i < m - 1; i++) {
- if(((a & 3) == (b & 3)) && ((a & 3) == 0 || (a & 3) == 3))
- return false;
- a = a >> 1;
- b = b >> 1;
- }
- return true;
- }
- // генерирует таблицу сравнения всех возможных столбцов высоты m
- vector< vector<int> > generate_comparsion_table(int m) {
- vector< vector<int> > can(1 << m, vector<int>(1 << m));
- for(int mask_a = 0; mask_a < (1 << m); mask_a++)
- for(int mask_b = 0; mask_b < (1 << m); mask_b++)
- can[mask_a][mask_b] = possible(mask_a, mask_b, m);
- return can;
- }
- // генерирует таблицу возможных комбинаций
- vector< vector<int> > generate_dp(int m, int n, const vector< vector<int> > & can) {
- vector< vector<int> > dp(n, vector<int>(1 << m));
- for(int mask = 0; mask < (1 << m); mask++)
- dp[0][mask] = 1;
- for(int i = 1; i < n; i++)
- for(int a = 0; a < (1 << m); a++)
- for(int b = 0; b < (1 << m); b++)
- dp[i][a] += dp[i - 1][b] * can[a][b];
- return dp;
- }
- int main() {
- ios::sync_with_stdio(false);
- cin.tie(0);
- int n, m;
- int ans = 0;
- vector< vector<int> > can;
- vector< vector<int> > dp;
- cin >> n >> m;
- can = generate_comparsion_table(m);
- dp = generate_dp(m, n, can);
- for(int mask = 0; mask < (1 << m); mask++)
- ans += dp.back()[mask];
- cout << ans << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement