結果

問題 No.3203 $\sin{x}$
ユーザー zoidzium (zz)
提出日時 2025-07-18 21:23:18
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 2 ms / 2,000 ms
コード長 22,934 bytes
コンパイル時間 3,676 ms
コンパイル使用メモリ 292,612 KB
実行使用メモリ 7,716 KB
最終ジャッジ日時 2025-07-18 21:23:22
合計ジャッジ時間 4,221 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 6
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vl = vector<ll>;
using vvl = vector<vl>;
using vvvl = vector<vvl>;

using xy = pair<ll, ll>;
using vxy = vector<xy>;
using vvxy = vector<vxy>;

using bs8 = bitset<8>;
using bs16 = bitset<16>;
using bs32 = bitset<32>;
using bs64 = bitset<64>;
using vbs8 = vector<bs8>;
using vbs16 = vector<bs16>;
using vbs32 = vector<bs32>;
using vbs64 = vector<bs64>;

using vs = vector<string>;
using vvs = vector<vs>;

using ull = unsigned long long;
using vul = vector<ull>;

using vd = vector<double>;
using vvd = vector<vd>;

using coord = pair<double, double>;
using vcoord = vector<coord>;

#define rep(var, n) for (ll var = 0; var < (n); var++)
#define cnt(var, n, m) for (ll var = (n); var <= (m); var++)
#define rcnt(var, n, m) for (ll var = (n); var >= (m); var--)
#define each(ite, C) for (auto ite = (C).begin(); ite != (C).end(); ite++)
#define reach(ite, C) for (auto ite = (C).rbegin(); ite != (C).rend(); ite++)
#define yn(b) cout << (((b) > 0) ? "Yes" : "No") << endl;

/////////////////////////////////////////////////
namespace zz_time {
/// @brief プログラム実行時のタイムポイント
std::chrono::_V2::system_clock::time_point START_TIME =
    std::chrono::system_clock::now();
/// @brief プログラム実行から経過時間をミリ秒で取得
/// @param st 経過開始時刻(基本引数指定する必要なし)
/// @return 経過時間ミリ秒
ll currentTime(std::chrono::_V2::system_clock::time_point st = START_TIME) {
  std::chrono::_V2::system_clock::time_point now =
      std::chrono::system_clock::now();
  return (ll)(std::chrono::duration_cast<std::chrono::milliseconds>(now - st)
                  .count());
};
/// @brief 実行時間が超過していないかの判定
/// @param mSec 実行時間制約ミリ秒
/// @return 実行時間制約以下であればtrue,その他はfalse
bool punctualityTime(const ll& mSec) { return (currentTime() < mSec); }

/// @brief 実行時間が超過しているかの判定
/// @param mSec 実行時間制約ミリ秒
/// @return 実行時間制約超過していればtrue,その他はfalse
bool spendTime(const ll& mSec) { return (currentTime() >= mSec); }
};  // namespace zz_time
using namespace zz_time;

namespace zz_random {
random_device seed_gen;
default_random_engine RANDOM_ENGINE(seed_gen());

/// @brief 整数閉区間[L,R]一様ランダム器生成
/// @param L 下限値 (default 0)
/// @param R 上限値 (default 1)
/// @return ランダム生成器, RAMDOM_ENGINEを引数としてランダム生成
uniform_int_distribution<> createIntCloseSegRandom(const ll& L = 0,
                                                   const ll& R = 1) {
  return uniform_int_distribution<>(L, R);
};

/// @brief 実数閉区間[L,R]一様ランダム器生成
/// @param L 下限値 (default 0.0)
/// @param R 上限値 (default 1.0)
/// @return ランダム生成器, RAMDOM_ENGINEを引数としてランダム生成
uniform_real_distribution<> createRealCloseSegRandom(const double& L = 0.0,
                                                     const double& R = 1.0) {
  return uniform_real_distribution<>(L, R);
};

/// @brief 正規表現ランダム器生成
/// @param average 平均値
/// @param s 標準偏差
/// @return ランダム生成器, RAMDOM_ENGINEを引数としてランダム生成
normal_distribution<> createNormalRandom(const double& average = 0.0,
                                         const double& s = 1.0) {
  return normal_distribution<>(average, s);
};

};  // namespace zz_random
using namespace zz_random;

namespace zz_mod {
class pp {
 public:
  ll val;
  ll mod;
  void recalc() {
    val %= mod;
    if (val < 0) val += mod;
  };

  /// @brief modint (+-*/ != exp ~ inv recalc )
  /// @param x value
  /// @param y mod (default= 998244353)
  pp(const ll& x = 0, const ll& y = 998244353) {
    val = x;
    mod = y;
    recalc();
  };

  friend pp operator+(const pp& x, const pp& y) {
    return pp(x.val + y.val, x.mod);
  };
  friend pp operator+(const pp&& x, const pp& y) {
    return pp(x.val + y.val, x.mod);
  };
  friend pp operator+(const pp& x, const pp&& y) {
    return pp(x.val + y.val, x.mod);
  };
  friend pp operator+(const pp&& x, const pp&& y) {
    return pp(x.val + y.val, x.mod);
  };

  template <typename T>
  friend pp operator+(const pp& x, const T& y) {
    return pp(x.val + y, x.mod);
  };
  template <typename T>
  friend pp operator+(const pp&& x, const T& y) {
    return pp(x.val + y, x.mod);
  };
  template <typename T>
  friend pp operator+(const pp& x, const T&& y) {
    return pp(x.val + y, x.mod);
  };
  template <typename T>
  friend pp operator+(const pp&& x, const T&& y) {
    return pp(x.val + y, x.mod);
  };

  friend pp operator-(const pp& x) { return pp(-x.val, x.mod); };
  friend pp operator-(const pp&& x) { return pp(-x.val, x.mod); };

  friend pp operator-(const pp& x, const pp& y) {
    return pp(x.val - y.val, x.mod);
  };
  friend pp operator-(const pp&& x, const pp& y) {
    return pp(x.val - y.val, x.mod);
  };
  friend pp operator-(const pp& x, const pp&& y) {
    return pp(x.val - y.val, x.mod);
  };
  friend pp operator-(const pp&& x, const pp&& y) {
    return pp(x.val - y.val, x.mod);
  };

  template <typename T>
  friend pp operator-(const pp& x, const T& y) {
    return pp(x.val - y, x.mod);
  };
  template <typename T>
  friend pp operator-(const pp&& x, const T& y) {
    return pp(x.val - y, x.mod);
  };
  template <typename T>
  friend pp operator-(const pp& x, const T&& y) {
    return pp(x.val - y, x.mod);
  };
  template <typename T>
  friend pp operator-(const pp&& x, const T&& y) {
    return pp(x.val - y, x.mod);
  };

  friend pp operator*(const pp& x, const pp& y) {
    return pp(x.val * y.val, x.mod);
  };
  friend pp operator*(const pp&& x, const pp& y) {
    return pp(x.val * y.val, x.mod);
  };
  friend pp operator*(const pp& x, const pp&& y) {
    return pp(x.val * y.val, x.mod);
  };
  friend pp operator*(const pp&& x, const pp&& y) {
    return pp(x.val * y.val, x.mod);
  };

  template <typename T>
  friend pp operator*(const pp& x, const T& y) {
    return pp(x.val * y, x.mod);
  };
  template <typename T>
  friend pp operator*(const pp&& x, const T& y) {
    return pp(x.val * y, x.mod);
  };
  template <typename T>
  friend pp operator*(const pp& x, const T&& y) {
    return pp(x.val * y, x.mod);
  };
  template <typename T>
  friend pp operator*(const pp&& x, const T&& y) {
    return pp(x.val * y, x.mod);
  };

  friend pp operator~(const pp& x) { return x.exp(-1); }
  friend pp operator~(const pp&& x) { return x.exp(-1); }

  friend pp operator/(const pp& x, const pp& y) { return x * (~y); };
  friend pp operator/(const pp&& x, const pp& y) { return x * (~y); };
  friend pp operator/(const pp& x, const pp&& y) { return x * (~y); };
  friend pp operator/(const pp&& x, const pp&& y) { return x * (~y); };

  template <typename T>
  friend pp operator/(const pp& x, const T& y) {
    return x * pp(y, x.mod).inv();
  };
  template <typename T>
  friend pp operator/(const pp&& x, const T& y) {
    return x * pp(y, x.mod).inv();
  };
  template <typename T>
  friend pp operator/(const pp& x, const T&& y) {
    return x * pp(y, x.mod).inv();
  };
  template <typename T>
  friend pp operator/(const pp&& x, const T&& y) {
    return x * pp(y, x.mod).inv();
  };

  friend pp& operator+=(pp& x, const pp& y) {
    x.val += y.val;
    x.recalc();
    return x;
  };
  friend pp& operator+=(pp& x, const pp&& y) {
    x.val += y.val;
    x.recalc();
    return x;
  };
  template <typename T>
  friend pp& operator+=(pp& x, const T& y) {
    x.val += y;
    x.recalc();
    return x;
  };
  template <typename T>
  friend pp& operator+=(pp& x, const T&& y) {
    x.val += y;
    x.recalc();
    return x;
  };

  friend pp& operator-=(pp& x, const pp& y) {
    x.val -= y.val;
    x.recalc();
    return x;
  };
  friend pp& operator-=(pp& x, const pp&& y) {
    x.val -= y.val;
    x.recalc();
    return x;
  };
  template <typename T>
  friend pp& operator-=(pp& x, const T& y) {
    x.val -= y;
    x.recalc();
    return x;
  };
  template <typename T>
  friend pp& operator-=(pp& x, const T&& y) {
    x.val -= y;
    x.recalc();
    return x;
  };

  friend pp& operator*=(pp& x, const pp& y) {
    x.val *= y.val;
    x.recalc();
    return x;
  };
  friend pp& operator*=(pp& x, const pp&& y) {
    x.val *= y.val;
    x.recalc();
    return x;
  };
  template <typename T>
  friend pp& operator*=(pp& x, const T& y) {
    x.val *= y;
    x.recalc();
    return x;
  };
  template <typename T>
  friend pp& operator*=(pp& x, const T&& y) {
    x.val *= y;
    x.recalc();
    return x;
  };

  friend pp& operator/=(pp& x, const pp& y) {
    x *= pp(y.val, x.mod).inv();
    x.recalc();
    return x;
  };
  friend pp& operator/=(pp& x, const pp&& y) {
    x *= pp(y.val, x.mod).inv();
    x.recalc();
    return x;
  };
  template <typename T>
  friend pp& operator/=(pp& x, const T& y) {
    x *= pp(y, x.mod).inv();
    x.recalc();
    return x;
  };
  template <typename T>
  friend pp& operator/=(pp& x, const T&& y) {
    x *= pp(y, x.mod).inv();
    x.recalc();
    return x;
  };

  pp exp(ll x) const {
    if (x == 0) {
      return pp(1, this->mod);
    }
    pp y = *this;

    if (x > 0) {
      vl Vec;
      while (x > 0) {
        Vec.push_back(x & 1);
        x >>= 1;
      }
      pp ans(1, this->mod);
      each(ite, Vec) {
        if (*ite) ans = ans * y;
        y = y * y;
      }

      return ans;
    }

    return y.exp(y.mod - 2).exp(-x);
  };

  pp inv() const {
    return ~(*this);
    return pp(this->val, this->mod).exp(-1);
  }
};

class factorial {
 public:
  const ll size;
  vector<pp> vec;
  /// @brief mod! (operator[] comb)
  /// @param x max! [0,x]  (default 1000000)
  /// @param y mod (default 998244353)
  factorial(const ll&& x = 1000000, const ll&& y = 998244353) : size(x + 1) {
    vec = vector<pp>(x + 1, pp(1, y));
    cnt(i, 2, x) vec[i] *= (vec[i - 1] * pp(i, y));
  };

  /// @brief mod factorial
  /// @return x! mod
  pp operator[](const ll& x) const { return vec[x]; };

  /// @brief mod factorial
  /// @return x! mod
  pp operator[](const ll&& x) const { return vec[x]; };

  /// @brief mod combination
  /// @param n
  /// @param m
  /// @return nCm
  pp comb(const ll n, const ll m) const {
    return (vec[n] / (vec[m] * vec[n - m]));
  };
};

}  // namespace zz_mod
using namespace zz_mod;

namespace zz_print {

namespace elm {
template <typename Arg>
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const Arg&& arg) {
  cout << "[" << arg << "| " << Indent << " " << Space << " ]" << endl;
};

void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const ll& elm) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << elm << string(Space, ' ');
};
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const int& elm) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << elm << string(Space, ' ');
};
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const ull& elm) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << elm << string(Space, ' ');
};
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const unsigned int& elm) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << elm << string(Space, ' ');
};

template <typename Elm1, typename Elm2>
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const pair<Elm1, Elm2>& pr) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << "< " << pr.first << " , " << pr.second << " >" << string(Space, ' ');
};

void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const pp& pr) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << "{ " << pr.val << " | " << pr.mod << " }" << string(Space, ' ');
};

void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const double& elm) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << elm << string(Space, ' ');
};
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const float& elm) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << elm << string(Space, ' ');
};

void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const char& elm) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << elm << string(Space, ' ');
};
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const string& elm) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << elm << string(Space, ' ');
};

void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const bs8& elm) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << elm << string(Space, ' ');
};
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const bs16& elm) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << elm << string(Space, ' ');
};
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const bs32& elm) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << elm << string(Space, ' ');
};
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const bs64& elm) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << elm << string(Space, ' ');
};

template <typename Elm>
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const vector<Elm>& Vec) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << "[" << string(Space, ' ');
  if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' ');
  each(ite, Vec) ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0),
                      Space, *ite);
  if (FlatHier >= 1) cout << endl << string(Indent, ' ');
  cout << "]" << string(Space, ' ');
};
template <typename Elm>
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const list<Elm>& Lst) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << "[" << string(Space, ' ');
  if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' ');
  each(ite, Lst) ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0),
                      Space, *ite);
  if (FlatHier >= 1) cout << endl << string(Indent, ' ');
  cout << "]" << string(Space, ' ');
};

template <typename Elm>
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const set<Elm>& SET) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << "[" << string(Space, ' ');
  if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' ');
  each(ite, SET) ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0),
                      Space, *ite);
  if (FlatHier >= 1) cout << endl << string(Indent, ' ');
  cout << "]" << string(Space, ' ');
};
template <typename Elm>
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const multiset<Elm>& SET) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << "[" << string(Space, ' ');
  if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' ');
  each(ite, SET) ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0),
                      Space, *ite);
  if (FlatHier >= 1) cout << endl << string(Indent, ' ');
  cout << "]" << string(Space, ' ');
};
template <typename Elm>
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const unordered_set<Elm>& SET) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << "[" << string(Space, ' ');
  if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' ');
  each(ite, SET) ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0),
                      Space, *ite);
  if (FlatHier >= 1) cout << endl << string(Indent, ' ');
  cout << "]" << string(Space, ' ');
};
template <typename Elm>
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const unordered_multiset<Elm>& SET) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << "[" << string(Space, ' ');
  if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' ');
  each(ite, SET) ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0),
                      Space, *ite);
  if (FlatHier >= 1) cout << endl << string(Indent, ' ');
  cout << "]" << string(Space, ' ');
};

template <typename Elm1, typename Elm2>
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const map<Elm1, Elm2>& MAP) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << "[" << string(Space, ' ');
  if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' ');
  each(ite, MAP) ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0),
                      Space, *ite);
  if (FlatHier >= 1) cout << endl << string(Indent, ' ');
  cout << "]" << string(Space, ' ');
};
template <typename Elm1, typename Elm2>
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const multimap<Elm1, Elm2>& MAP) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << "[" << string(Space, ' ');
  if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' ');
  each(ite, MAP) ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0),
                      Space, *ite);
  if (FlatHier >= 1) cout << endl << string(Indent, ' ');
  cout << "]" << string(Space, ' ');
};
template <typename Elm1, typename Elm2>
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const unordered_map<Elm1, Elm2>& MAP) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << "[" << string(Space, ' ');
  if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' ');
  each(ite, MAP) ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0),
                      Space, *ite);
  if (FlatHier >= 1) cout << endl << string(Indent, ' ');
  cout << "]" << string(Space, ' ');
};
template <typename Elm1, typename Elm2>
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const unordered_multimap<Elm1, Elm2>& MAP) {
  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << "[" << string(Space, ' ');
  if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' ');
  each(ite, MAP) ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0),
                      Space, *ite);
  if (FlatHier >= 1) cout << endl << string(Indent, ' ');
  cout << "]" << string(Space, ' ');
};

template <typename Elm>
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const stack<Elm>& Sta) {
  stack<Elm> Datas = Sta;

  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << "(" << string(Space, ' ');
  if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' ');
  while (!Datas.empty()) {
    Elm Data = Datas.top();
    Datas.pop();
    ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0), Space,
         Data);
  }
  if (FlatHier >= 1) cout << endl << string(Indent, ' ');
  cout << "]" << string(Space, ' ');
};
template <typename Elm>
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const queue<Elm>& Que) {
  queue<Elm> Datas = Que;

  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << "(" << string(Space, ' ');
  if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' ');
  while (!Datas.empty()) {
    Elm Data = Datas.front();
    Datas.pop();
    ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0), Space,
         Data);
  }
  if (FlatHier >= 1) cout << endl << string(Indent, ' ');
  cout << "]" << string(Space, ' ');
};
template <typename Elm>
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const priority_queue<Elm>& Que) {
  priority_queue<Elm> Datas = Que;

  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << "(" << string(Space, ' ');
  if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' ');
  while (!Datas.empty()) {
    Elm Data = Datas.top();
    Datas.pop();
    ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0), Space,
         Data);
  }
  if (FlatHier >= 1) cout << endl << string(Indent, ' ');
  cout << "]" << string(Space, ' ');
};
template <typename Elm>
void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space,
          const deque<Elm>& Que) {
  deque<Elm> Datas = Que;

  if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' ');
  cout << "(" << string(Space, ' ');
  if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' ');
  while (!Datas.empty()) {
    Elm Data = Datas.front();
    Datas.pop_front();
    ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0), Space,
         Data);
  }
  if (FlatHier >= 1) cout << endl << string(Indent, ' ');
  cout << "]" << string(Space, ' ');
};

}  // namespace elm

namespace branch {
void ZOUT_branch(const ll& FlatHier, const ll& Indent, const ll& Space) {};
template <typename HeadArg, typename... Args>
void ZOUT_branch(const ll& FlatHier, const ll& Indent, const ll& Space,
                 HeadArg&& headArg, Args&&... args) {
  zz_print::elm::ZOUT(FlatHier, Indent, Space, headArg);
  ZOUT_branch(FlatHier, Indent, Space, std::forward<Args>(args)...);
};
template <typename HeadArg, typename... Args>
void ZOUT_branch(const ll& FlatHier, const ll& Indent, const ll& Space,
                 HeadArg& headArg, Args&... args) {
  zz_print::elm::ZOUT(FlatHier, Indent, Space, headArg);
  ZOUT_branch(FlatHier, Indent, Space, std::forward<Args>(args)...);
};
}  // namespace branch

/// @brief プリント関数
/// @tparam FlatHier 改行による階層表示数 (default 0 改行なし)
/// @tparam Space 表示スペース間隔 (default 2)
/// @tparam InitIndent インデント間隔 (default 0)
/// @tparam ...Args 可変引数型 (指定する必要なし)
/// @param ...args 可変引数
template <ll FlatHier = 0, ll Space = 2, ll InitIndent = 0, typename... Args>
void zout(Args&&... args) {
  cout << flush;
  branch::ZOUT_branch(FlatHier, InitIndent, Space, std::forward<Args>(args)...);
  cout << endl;
};
};  // namespace zz_print
using namespace zz_print;

/////////////////////////////////////////////////

int main() {
  ll x;
  cin >> x;
  if (x < 0) x *= -1;
  yn(x == 0);
  return 0;
}
0