結果

問題 No.2511 Mountain Sequence
ユーザー ojisan_ITojisan_IT
提出日時 2023-10-25 03:09:51
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 72 ms / 2,000 ms
コード長 2,386 bytes
コンパイル時間 1,617 ms
コンパイル使用メモリ 173,120 KB
実行使用メモリ 9,656 KB
最終ジャッジ日時 2024-09-24 22:45:33
合計ジャッジ時間 4,928 ms
ジャッジサーバーID
(参考情報)
judge1 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 67 ms
9,656 KB
testcase_01 AC 68 ms
9,560 KB
testcase_02 AC 69 ms
9,596 KB
testcase_03 AC 69 ms
9,436 KB
testcase_04 AC 68 ms
9,544 KB
testcase_05 AC 68 ms
9,644 KB
testcase_06 AC 67 ms
9,612 KB
testcase_07 AC 68 ms
9,468 KB
testcase_08 AC 68 ms
9,476 KB
testcase_09 AC 71 ms
9,576 KB
testcase_10 AC 72 ms
9,456 KB
testcase_11 AC 70 ms
9,480 KB
testcase_12 AC 71 ms
9,564 KB
testcase_13 AC 68 ms
9,512 KB
testcase_14 AC 69 ms
9,476 KB
testcase_15 AC 72 ms
9,616 KB
testcase_16 AC 69 ms
9,484 KB
testcase_17 AC 68 ms
9,436 KB
testcase_18 AC 69 ms
9,492 KB
testcase_19 AC 71 ms
9,488 KB
testcase_20 AC 69 ms
9,496 KB
testcase_21 AC 70 ms
9,596 KB
testcase_22 AC 70 ms
9,444 KB
testcase_23 AC 68 ms
9,648 KB
testcase_24 AC 71 ms
9,548 KB
testcase_25 AC 69 ms
9,596 KB
testcase_26 AC 68 ms
9,628 KB
testcase_27 AC 68 ms
9,596 KB
testcase_28 AC 67 ms
9,580 KB
testcase_29 AC 70 ms
9,560 KB
testcase_30 AC 72 ms
9,540 KB
testcase_31 AC 71 ms
9,336 KB
testcase_32 AC 69 ms
9,600 KB
testcase_33 AC 69 ms
9,624 KB
testcase_34 AC 69 ms
9,604 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
template<class T> using vt = vector<T>;
template<class T> using vvt = vector<vt<T>>;
template<class T> using ttt = tuple<T,T>;
using tii = tuple<int,int>;
using vi = vector<int>;
#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define pb push_back
#define mt make_tuple
#define ALL(a) (a).begin(),(a).end()
#define FST first
#define SEC second
#define DEB cerr<<"!"<<endl
#define SHOW(a,b) cerr<<(a)<<" "<<(b)<<endl
//#define DIV int(1e9+7)
#define DIV 998244353

//const double PI = M_PI;
inline ll pow(ll x,ll n,ll m){ll r=1;while(n>0){if((n&1)==1)r=r*x%m;x=x*x%m;n>>=1;}return r%m;}
inline ll lcm(ll d1, ll d2){return d1 / __gcd(d1, d2) * d2;}
const int IINF = (INT_MAX/2);
const ll LLINF = (LLONG_MAX/2);
const double eps = 1e-8;

/*Coding Space*/
/*
フェルマーの小定理を利用したcombination,permutation,multi_choose計算
事前処理O(n)によってそれぞれをO(1)で求められる
ただしDIVの値が素数でないとフェルマーの小定理が成り立たないので注意が必要

↓ここの解説・コードを一部改変してyukicoder 117に通るようにした
http://keita-matsushita.hatenablog.com/entry/2016/12/05/184011
*/
class FermatCombination{
public:
  vector<ll> factrial; // 階乗
  vector<ll> inverse; // 逆元
  FermatCombination(int size){
    factrial.resize(size+1);
    inverse.resize(size+1);
    factrial[0] = 1;
    inverse[0] = 1;
    for(int i = 1; i < size+1; i++){
      factrial[i] = factrial[i-1] * i % DIV;
      inverse[i] = pow(factrial[i],DIV-2,DIV);
    }
  }
  ll combination(int n, int k){
    if(n < k) return 0;
    return factrial[n]* inverse[k] % DIV * inverse[n - k] % DIV;
  }
  ll permutation(int n, int k){
    if(n < k) return 0;
    return factrial[n] * inverse[n-k] % DIV;
  }
  ll multi_choose(int n, int k){
    if(n == 0 && k == 0) return 1;
    else return combination(n+k-1,k);
  }
};
/* verify
yukicoder 117
yukicoder 573
*/

FermatCombination fc(400011);
map<ll,int> m;
map<ll,int> table[301];
int main(){
  ll n,m; cin >> n >> m;
  // 1,2,3,4, ..., m-1, m, m-1 ... , 4,3,2,1 という長さ2m-1の数列からmを除いた2m-2個からn-1個取る通りの数の和を求める
  ll ans = 0;
  for(int i = 0; i <= m; ++i){
    if(2*i-2>=0)ans += fc.combination(2*i-2,n-1)%DIV;
    ans %= DIV;
  }
  cout << ans << endl;
}
0