結果

問題 No.361 門松ゲーム2
ユーザー kuhaku
提出日時 2021-06-21 07:04:04
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 364 ms / 2,000 ms
コード長 6,186 bytes
コンパイル時間 2,574 ms
コンパイル使用メモリ 208,884 KB
最終ジャッジ日時 2025-01-22 10:55:17
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 28
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

// clang-format off
#include <bits/stdc++.h>
using namespace std;
using ll = int64_t;
using ld = long double;
using Pi = pair<int, int>;
using Pl = pair<ll, ll>;
using Vi = vector<int>;
using Vl = vector<ll>;
#define FOR(i, m, n) for(int i = (m); i < (n); ++i)
#define FORR(i, m, n) for(int i = (m)-1; i >= (n); --i)
#define rep(i, n) FOR(i, 0, n)
#define repn(i, n) FOR(i, 1, n+1)
#define repr(i, n) FORR(i, n, 0)
#define repnr(i, n) FORR(i, n+1, 1)
#define all(s) (s).begin(), (s).end()
template <class T, class U>
bool chmax(T &a, const U b) { return a < b ? a = b, true : false; }
template <class T, class U>
bool chmin(T &a, const U b) { return b < a ? a = b, true : false; }
template <class T>
istream &operator>>(istream &is, vector<T> &v) { for (T &i : v) is>>i; return is; }
template <class T>
ostream &operator<<(ostream &os, const vector<T> &v) {
for (auto it=v.begin(); it!=v.end(); ++it) { os<<(it==v.begin()?"":" ")<<*it; } return os;
}
template <class Head, class... Tail>
void co(Head&& head, Tail&&... tail) {
if constexpr(sizeof...(tail)==0) cout<<head<<'\n'; else cout<<head<<' ',co(forward<Tail>(tail)...);
}
template <class Head, class... Tail>
void ce(Head&& head, Tail&&... tail) {
if constexpr(sizeof...(tail)==0) cerr<<head<<'\n'; else cerr<<head<<' ',ce(forward<Tail>(tail)...);
}
template<typename T, typename... Args>
auto make_vector(T x, int arg, Args ...args) {
if constexpr(sizeof...(args)==0) return vector<T>(arg, x); else return vector(arg,make_vector<T>(x, args...));
}
void sonic() { ios::sync_with_stdio(false); cin.tie(nullptr); }
void setp(const int n) { cout << fixed << setprecision(n); }
constexpr int64_t INF = 1000000000000000003;
constexpr int Inf = 1000000003;
constexpr int MOD = 1000000007;
constexpr int MOD_N = 998244353;
constexpr double EPS = 1e-7;
const double PI = acos(-1);
struct prime_number {
const int sz = 1 << 22;
bitset<1 << 22> is_not_prime;
vector<int> data;
prime_number() { init(); }
void init() {
is_not_prime[0] = is_not_prime[1] = true;
for (int i = 2; i < sz; ++i) {
if (!is_not_prime[i]) {
data.emplace_back(i);
if ((int64_t)i * i >= sz) continue;
for (int j = i * i; j < sz; j += i) {
is_not_prime[j] = true;
}
}
}
}
bool is_prime(int64_t n) {
assert(n >= 0);
if (n < sz) return !is_not_prime[n];
for (auto i : data) {
if ((int64_t)i * i > n) break;
if (n % i == 0) return false;
}
return true;
}
vector<int> prime_numbers(int x) {
vector<int> res;
for (int i = 2; i <= x; ++i) {
if (is_prime(i)) res.emplace_back(i);
}
return res;
}
//
template <class T>
vector<pair<T, int>> prime_factorization(T x) {
if (x == 1) return vector<pair<T, int>>(1, {1, 1});
vector<pair<T, int>> res;
for (auto i : data) {
int cnt = 0;
for (; x % i == 0; x /= i) cnt++;
if (cnt) res.emplace_back(i, cnt);
if ((int64_t)i * i > x) break;
}
if (x != 1) res.emplace_back(x, 1);
return res;
}
//
template <class T>
vector<T> divisors(T x) {
auto v = prime_factorization(x);
vector<T> res, a, b, cp;
res.emplace_back(1);
for (auto p : v) {
int n = res.size();
cp.resize(n);
copy(res.begin(), res.end(), cp.begin());
a.resize(n);
T t = 1;
for (int k = 0; k < p.second; ++k) {
t *= p.first;
for (int i = 0; i < n; ++i) a[i] = cp[i] * t;
merge(res.begin(), res.end(), a.begin(), a.end(),
back_inserter(b));
swap(res, b);
b.clear();
}
}
return res;
}
//
template <class T>
vector<vector<T>> factorization(T x) {
vector<vector<T>> res;
auto f = [&](auto self, vector<T> v, T a) -> void {
if (a == 1) res.emplace_back(v);
for (auto i : divisors(a)) {
if (i == 1 || (!v.empty() && v.back() > i)) continue;
v.emplace_back(i);
self(self, v, a / i);
v.pop_back();
}
};
f(f, vector<T>(), x);
return res;
}
};
prime_number pn;
struct MEX {
int n;
int sz;
vector<bool> is_exist;
vector<int> v;
MEX() : n(), sz(), is_exist(64) {}
int operator()() const {
return n;
}
void add(int x) {
++sz;
if (sz == is_exist.size()) {
is_exist.resize(sz << 1);
int cnt = 0;
for (int i = 0; i < v.size(); ++i) {
if (v[i] < is_exist.size()) {
if (is_exist[v[i]])
--sz;
else
is_exist[v[i]] = true;
} else {
v[cnt++] = v[i];
}
}
v.erase(v.begin() + cnt, v.end());
}
if (x < is_exist.size()) {
if (is_exist[x])
--sz;
else
is_exist[x] = true;
} else {
v.emplace_back(x);
}
while (is_exist[n])
++n;
}
int get() const {
return n;
}
};
// clang-format on
int main(void) {
int l, d;
cin >> l >> d;
unordered_map<int, int> memo;
auto f = [&](auto self, int x) -> int {
if (memo.find(x) != memo.end()) {
return memo[x];
}
MEX mex;
FOR(i, 1, x + 1) {
FOR(j, i + 1, x + 1) {
int k = x - i - j;
if (i + j + k == x && j < k && k - i <= d) {
mex.add(self(self, i) ^ self(self, j) ^ self(self, k));
}
}
}
return memo[x] = mex();
};
if (f(f, l))
puts("kado");
else
puts("matsu");
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0