結果
問題 | No.2007 Arbitrary Mod (Easy) |
ユーザー | Zaurus |
提出日時 | 2022-07-15 21:21:42 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 27 ms / 2,000 ms |
コード長 | 5,019 bytes |
コンパイル時間 | 2,566 ms |
コンパイル使用メモリ | 198,952 KB |
最終ジャッジ日時 | 2025-01-30 07:19:59 |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 30 |
ソースコード
#include <bits/stdc++.h> // #include <atcoder/all> // using namespace atcoder; typedef long long ll; typedef long double ld; #define rep(i,n) for(ll i=0;i<(n);i++) #define repr(i,n) for(ll i=(n-1);i>=0;i--) #define all(x) x.begin(),x.end() #define br cout << '\n'; using namespace std; const long long INF = 8e18; using Graph = vector<vector<ll>>; template<class T> inline bool chmin(T &a, T b) { if(a > b){ a = b; return true;} return false;} template<class T> inline bool chmax(T &a, T b) { if(a < b){ a = b; return true;} return false;} ll ceilll(ll a, ll b) {return (a + b-1) / b;} // if(a%b != 0) (a/b) + 1 ll get_digit(ll a) {ll digit = 0; while(a != 0){a /= 10; digit++;} return digit;} // a != 0 template<typename T> void vecdbg(vector<T>& v){ rep(i, v.size()){cerr << v[i] << ' ';} cerr << '\n';} template<typename T> void vecvecdbg(vector<vector<T>>& v){ rep(i, v.size()){rep(j, v[i].size()){cerr << v[i][j] << ' ';} cerr << '\n';}} ll POW(ll a, ll n){ ll res = 1; while(n > 0){ if(n & 1){ res = res * a; } a *= a; n >>= 1; } return res; } using P = pair<ll, ll>; const double PI = acos(-1); // 0 false, 1 true // string number to int : -48 or - '0' // a to A : -32 // ceil(a) 1.2->2.0 // c++17 g++ -std=c++17 a.cpp // global vector -> 0 initialization // DONT FORGET TO INTIALIZE // The type of GRID is CHAR. DONT USE STRING // If the result in local and judge is different, USE CODETEST!! // (a * b)over flow? if(a > INF / b){ /* overflow */} //https://atcoder.jp/contests/abc172/submissions/14765570 //20200724 template<long long mod> struct ModInt { long long x; ModInt () : x(0) {} ModInt (long long x) : x(x >= 0 ? x % mod : (mod - -x % mod) % mod) {} ModInt &operator += (const ModInt &p){ if ((x += p.x) >= mod) x -= mod; return *this; } ModInt &operator -= (const ModInt &p) { if ((x += mod - p.x) >= mod) x -= mod; return *this; } ModInt &operator *= (const ModInt &p) { x = (long long) x * p.x % mod; return *this; } ModInt &operator /= (const ModInt &p) { *this *= p.inverse(); return *this; } ModInt &operator ^= (long long p) { ModInt res = 1; for (; p; p >>= 1) { if (p & 1) res *= *this; *this *= *this; } return *this = res; } ModInt operator - () const { return ModInt(-x); } ModInt operator + (const ModInt &p) const { return ModInt(*this) += p; } ModInt operator - (const ModInt &p) const { return ModInt(*this) -= p; } ModInt operator * (const ModInt &p) const { return ModInt(*this) *= p; } ModInt operator / (const ModInt &p) const { return ModInt(*this) /= p; } ModInt operator ^ (long long p) const { return ModInt(*this) ^= p; } bool operator == (const ModInt &p) const { return x == p.x; } bool operator != (const ModInt &p) const { return x != p.x; } explicit operator long long() const { return x; } ModInt &operator = (const long long p) { x = p; return *this;} ModInt inverse() const { long long a = x, b = mod, u = 1, v = 0, t; while (b > 0) { t = a / b; a -= t * b; std::swap(a, b); u -= t * v; std::swap(u, v); } return ModInt(u); } friend std::ostream & operator << (std::ostream &stream, const ModInt<mod> &p) { return stream << p.x; } friend std::istream & operator >> (std::istream &stream, ModInt<mod> &a) { long long x; stream >> x; a = ModInt<mod>(x); return stream; } }; template<long long mod> struct MComb { using mint = ModInt<mod>; std::vector<mint> fact; std::vector<mint> inv; MComb (long long n) { // O(n + log(mod)) fact = std::vector<mint>(n + 1, 1); for (long long i = 1; i <= n; i++) fact[i] = fact[i - 1] * mint(i); inv.resize(n + 1); inv[n] = fact[n] ^ (mod - 2); for (long long i = n; i--; ) inv[i] = inv[i + 1] * mint(i + 1); } mint ncr(long long n, long r) { return fact[n] * inv[r] * inv[n - r]; } mint npr(long n, long r) { return fact[n] * inv[n - r]; } //nhr : n : shikiri + 1, r : tamanokazu mint nhr(long n, long r) { assert(n + r - 1 < (long long) fact.size()); return ncr(n + r - 1, r); } }; template<long long mod> struct MPow { using mint = ModInt<mod>; mint modpow(mint a, long long n) { mint res = 1; while(n > 0){ if(n & 1){ res = res * a; } a = a * a; n >>= 1; } return res; } }; #define MOD 998244353 typedef ModInt<MOD> mint; MComb<MOD> com(510000); // com.ncr(n, r) n < r の値入れちゃダメ nprも nhrは入れていい MPow<MOD> mpow; int main() { std::cout << std::fixed << std::setprecision(15); ll a, n; cin >> a >> n; ll m = 998244353; cout << m << endl; cout << mpow.modpow(a, n) << endl; }