結果
問題 | No.2351 Butterfly in Summer |
ユーザー |
![]() |
提出日時 | 2023-06-16 21:33:25 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 3,526 bytes |
コンパイル時間 | 2,093 ms |
コンパイル使用メモリ | 193,968 KB |
最終ジャッジ日時 | 2025-02-14 04:30:48 |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 21 |
ソースコード
#include<bits/stdc++.h>#define REP(i,n) for(int i=0,i##_len=int(n);i<i##_len;++i)#define rep(i,a,b) for(int i=int(a);i<int(b);++i)#define All(x) (x).begin(),(x).end()#define rAll(x) (x).rbegin(),(x).rend()using namespace std;using ll = long long;typedef long long ll;constexpr ll mod=998244353;class mint {private:ll _num,_mod = mod;mint set(ll num){_num = num ;if(_num<0){if(_num>=-_mod)_num=_mod+_num;else _num=_mod-(-_num)%_mod;}else if(_num>=_mod) _num%=_mod;return *this;}ll imod()const{ll n=_mod-2;ll ans = 1,x=_num;while(n != 0){if(n&1) ans = ans*x%_mod;x = x*x%_mod;n = n >> 1;}return ans;}public:explicit mint(){ _num = 0; }explicit mint(ll num){_num = num;if(_num<0){if(_num>=-_mod)_num=_mod+_num;else _num=_mod-(-_num)%_mod;}else if(_num>=_mod) _num%=_mod;}explicit mint(ll num,ll M){_mod=M;_num=num;if(_num<0){if(_num>=-_mod)_num=_mod+_num;else _num=_mod-(-_num)%_mod;}else if(_num>=_mod) _num%=_mod;}mint(const mint &cp){_num=cp._num;_mod=cp._mod;}mint operator+ (const mint &x)const{ return mint(_num + x._num , _mod); }mint operator- (const mint &x)const{ return mint(_num - x._num , _mod);}mint operator* (const mint &x)const{ return mint(_num * x._num , _mod); }mint operator/ (const mint &x)const{ return mint(_num * x.imod() , _mod);}mint operator+=(const mint &x){ return set(_num + x._num); }mint operator-=(const mint &x){ return set(_num - x._num); }mint operator*=(const mint &x){ return set(_num * x._num); }mint operator/=(const mint &x){ return set(_num * x.imod());}mint operator= (const ll x){ return set(x); }mint operator+ (const ll x)const{return *this + mint(x,_mod); }mint operator- (const ll x)const{ return *this - mint(x,_mod); }mint operator* (const ll x)const{ return *this * mint(x,_mod); }mint operator/ (const ll x)const{ return *this/mint(x, _mod);}mint operator+=(const ll x){ *this = *this + x;return *this; }mint operator-=(const ll x){ *this = *this - x;return *this; }mint operator*=(const ll x){ *this = *this * x;return *this;}mint operator/=(const ll x){ *this = *this / x;return *this;}bool operator==(const mint &x)const{return _num==x._num;}bool operator!=(const mint &x)const{return _num!=x._num;}friend mint operator+(ll x,const mint &m){return mint(m._num + x , m._mod);}friend mint operator-(ll x,const mint &m){return mint( x - m._num , m._mod);}friend mint operator*(ll x,const mint &m){return mint(m._num * (x % m._mod) , m._mod);}friend mint operator/(ll x,const mint &m){return mint(m.imod() * (x % m._mod) , m._mod);}explicit operator ll() { return _num; }explicit operator int() { return (int)_num; }friend std::ostream& operator<<(std::ostream &os, const mint &x){ os << x._num; return os; }friend std::istream& operator>>(std::istream &is, mint &x){ll val; is>>val; x.set(val); return is;}};ll mpow(ll x, ll n){ //x^n(mod) ←普通にpow(x,n)では溢れてしまうため,随時mod計算 2分累乗法だから早いll ans = 1;x %= mod;if( x == 0 ) return 0;while(n != 0){if(n&1) ans = ans*x % mod;x = x*x % mod;n = n >> 1;}return ans;}int main(){mint n,k;cin>>n>>k;cout << n * k * (k-1)/ mpow((ll)k, (ll)n) << endl;}