マークのある地点までの距離をが等しい箇所を数えてしまって良い。
同じ地点が F 箇所ある場合、ただの並び替えなので F 階乗パターン。
- int dist(pair<int, int> a, pair<int, int> b)
- {
- return max(abs(a.first - b.first), abs(a.second - b.second));
- }
- class FoxStones {
- public:
- int getCount(int N, int M, vector <int> sj, vector <int> si)
- {
- swap(N, M);
- map< vector<int>, int > cnt;
- vector< pair<int, int> > marked;
- for (int k = 0; k < si.size(); ++k) {
- marked.push_back(make_pair(si[k] - 1, sj[k] - 1));
- }
- sort(marked.begin(), marked.end());
- for (int i = 0; i < N; ++i) {
- for (int j = 0; j < M; ++j) {
- if (binary_search(marked.begin(), marked.end(), make_pair(i, j))) continue;
- vector<int> u;
- for (int k = 0; k < marked.size(); ++k) {
- u.push_back(dist(make_pair(i, j), marked[k]));
- }
- ++cnt[u];
- }
- }
- const lli mod = 1000000009;
- const int F = 200 * 200 + 10;
- lli fact[F];
- fact[0] = 1;
- for (lli i = 1; i < F; ++i) {
- fact[i] = fact[i - 1] * i;
- fact[i] %= mod;
- }
- lli ret = 1;
- each (i, cnt) {
- ret *= fact[i->second];
- ret %= mod;
- }
- return ret;
- }
- }