Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma comment(linker, "/STACK:100000000000000")
- #include <stdio.h>
- #include <vector>
- #include <map>
- #include <string>
- #include <algorithm>
- #include <set>
- #include <stack>
- #include <queue>
- #include <math.h>
- #include <stdlib.h>
- #include <iostream>
- #include <iomanip>
- #include <sstream>
- #include <string.h>
- #include <cctype>
- #include <cassert>
- #include <ctime>
- #define mp make_pair
- #define pb push_back
- #define lo int
- #define li long long int
- #define db long double
- #define FOR(i, n) for(lo i = 0; i < (n); i++)
- #define pi 3.14159265358979323
- #define eps 1e-10
- #define MN 510
- #define sz(a) (lo) (a).size()
- #define SM 1<<6
- using namespace std;
- const li INF = 2e9;
- lo dp[MN][SM];
- map<lo, vector<lo> > g[SM];
- set<pair<lo, pair<lo, lo> > > own[SM];
- map<li, lo> kash;
- inline bool submask(lo a, lo b)
- {
- return ((a ^ b) | a) == a;
- }
- li base;
- inline li wat(lo id, vector<lo> &good)
- {
- sort(good.begin(), good.end());
- li now = 1, out = 0;
- FOR(i, sz(good))
- {
- now *= base;
- out += (good[i] + 1) * now;
- }
- now *= base;
- return out + (id + 1) * now;
- }
- inline bool is_good(lo a, lo n)
- {
- lo cnt = 0;
- FOR(i, n)
- {
- if(!(a & (1<<i)))
- {
- if(cnt & 1)
- return false;
- cnt = 0;
- }
- else
- cnt++;
- }
- return !(cnt & 1);
- }
- lo mod = 1000000007;
- inline lo take_me(lo id, vector<lo> &now)
- {
- li hash = wat(id, now);
- if(kash.count(hash))
- return kash[hash];
- if(!id)
- {
- lo sum = 0;
- FOR(i, sz(now))
- {
- sum = (sum + dp[id][now[i]]) % mod;
- }
- return kash[hash] = sum;
- }
- map<lo, map<lo, lo> > taked;
- FOR(i, sz(now))
- {
- lo to = now[i];
- for(map<lo, vector<lo> > ::iterator it = g[to].begin(); it != g[to].end(); it++)
- {
- FOR(j, sz(it->second))
- {
- lo v = it->first;
- lo to2 = it->second[j];
- taked[v][to2]++;
- }
- }
- }
- lo sum = 0;
- for(map<lo, map<lo, lo> >::iterator it = taked.begin(); it != taked.end(); it++)
- {
- if(id == 1 && it->first)
- continue;
- vector<lo> with;
- for(map<lo, lo>::iterator it2 = it->second.begin(); it2 != it->second.end(); it2++)
- {
- with.push_back(it2->first);
- }
- sum = (sum + take_me(id - 1, with)) % mod;
- }
- return kash[hash] = sum;
- }
- int main()
- {
- //#ifdef _DEBUG
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- //#else
- // freopen("roses.in", "r", stdin);
- // freopen("roses.out", "w", stdout);
- //#endif
- lo n, m;
- cin >> n >> m >> base;
- memset(dp, 0, sizeof dp);
- FOR(i, (1<<n))
- {
- FOR(j, (1<<n))
- {
- FOR(k, (1<<n))
- {
- if(!submask(j, k))
- continue;
- lo vi = (j ^ k);
- if(!submask(vi, i))
- continue;
- lo temp = (vi ^ i);
- if(is_good(temp, n))
- g[i][j].push_back(k);
- }
- }
- }
- memset(dp, 0, sizeof dp);
- dp[0][0] = 1;
- for(lo i = 1; i <= m + 1; i++)
- {
- FOR(j, (1<<n))
- {
- for(map<lo, vector<lo> >::iterator it = g[j].begin(); it != g[j].end(); it++)
- {
- if(i == 1 && it->first)
- continue;
- dp[i][j] = (dp[i][j] + take_me(i - 1, it->second)) % mod;
- }
- }
- }
- cout << "{";
- for(lo i = 1; i <= m + 1; i++)
- {
- cout << dp[i][0];
- if(i == m + 1)
- cout << "}";
- else
- cout << ",";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment