結果

問題 No.1771 A DELETEQ
ユーザー 👑 NachiaNachia
提出日時 2021-12-05 16:16:33
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 12 ms / 3,500 ms
コード長 3,501 bytes
コンパイル時間 2,660 ms
コンパイル使用メモリ 124,012 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-07-07 07:51:39
合計ジャッジ時間 6,147 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 2 ms
5,376 KB
testcase_02 AC 11 ms
5,376 KB
testcase_03 AC 1 ms
5,376 KB
testcase_04 AC 10 ms
5,376 KB
testcase_05 AC 12 ms
5,376 KB
testcase_06 AC 2 ms
5,376 KB
testcase_07 AC 2 ms
5,376 KB
testcase_08 AC 1 ms
5,376 KB
testcase_09 AC 3 ms
5,376 KB
testcase_10 AC 3 ms
5,376 KB
testcase_11 AC 4 ms
5,376 KB
testcase_12 AC 4 ms
5,376 KB
testcase_13 AC 3 ms
5,376 KB
testcase_14 AC 6 ms
5,376 KB
testcase_15 AC 10 ms
5,376 KB
testcase_16 AC 10 ms
5,376 KB
testcase_17 AC 2 ms
5,376 KB
testcase_18 AC 4 ms
5,376 KB
testcase_19 AC 1 ms
5,376 KB
testcase_20 AC 6 ms
5,376 KB
testcase_21 AC 3 ms
5,376 KB
testcase_22 AC 5 ms
5,376 KB
testcase_23 AC 6 ms
5,376 KB
testcase_24 AC 3 ms
5,376 KB
testcase_25 AC 2 ms
5,376 KB
testcase_26 AC 6 ms
5,376 KB
testcase_27 AC 3 ms
5,376 KB
testcase_28 AC 3 ms
5,376 KB
evil_hand_1.txt AC 406 ms
11,724 KB
evil_hand_2.txt AC 2 ms
5,376 KB
evil_hand_3.txt AC 2 ms
5,376 KB
evil_random_1.txt AC 88 ms
5,376 KB
evil_random_2.txt AC 185 ms
7,652 KB
evil_random_3.txt AC 185 ms
7,492 KB
evil_random_4.txt AC 382 ms
11,640 KB
evil_random_5.txt AC 184 ms
7,572 KB
evil_random_6.txt AC 91 ms
5,376 KB
evil_random_7.txt AC 388 ms
10,932 KB
evil_random_8.txt AC 402 ms
10,940 KB
evil_random_9.txt AC 390 ms
10,896 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
using i32 = int32_t;
using u32 = uint32_t;
using i64 = int64_t;
using u64 = uint64_t;
#define rep(i,n) for(int i=0; i<(n); i++)


#include <atcoder/modint>
#include <atcoder/convolution>
const unsigned int MOD = 998244353;
using m32 = atcoder::static_modint<MOD>;



 
vector<m32> vectorm32_slice(const vector<m32>& src, int l, int r){
    vector<m32> res(r-l);
    for(int i=l; i<r; i++) res[i-l] = src[i];
    return res;
}
void vectorm32_concat(vector<m32>& dst, const vector<m32>& src){
    for(auto a : src) dst.push_back(a);
}


vector<m32> powsumFPS(const vector<m32>& A, int n){
    if(n == 0){ return {}; }
    if(n == 1){ return { 1 }; }
    vector<m32> hInv = {1};
    while(hInv.size() < n){
        int nn = hInv.size();
        vector<m32> tmp(nn*2);
        for(int i=0; i<A.size() && i<nn*2; i++) tmp[i] = A[i];
        tmp = vectorm32_slice(atcoder::convolution(hInv, tmp), nn, nn*2);
        tmp = vectorm32_slice(atcoder::convolution(tmp, hInv), 0, min(n-nn, nn));
        vectorm32_concat(hInv, tmp);
    }
    return hInv;
}
 
 
vector<m32> invFPS(const vector<m32>& A, int n){
    m32 iA0 = A[0].inv();
    vector<m32> xA(min(n,(int)A.size()));
    for(int i=0; i<xA.size(); i++) xA[i] = -A[i] * iA0;
    xA[0] = 0;
    xA = powsumFPS(xA,n);
    for(int i=0; i<xA.size(); i++) xA[i] *= iA0;
    return xA;
}
 
 
static vector<m32> InvMOD = {1,1};
 
vector<m32> logFPS(const vector<m32>& A, int n){
    int z = A.size();
    for(int i=InvMOD.size(); i<=n; i++){
        InvMOD.push_back(-InvMOD[MOD % i] * (MOD / i));
    }
    auto res = invFPS(A, n);
    vector<m32> Abuf(z);
    rep(i,z-1) Abuf[i] = A[i+1] * (i+1);
    res = atcoder::convolution(res, Abuf);
    res.resize(n);
    for(int i=n-2; i>=0; i--) res[i+1] = res[i] * InvMOD[i+1];
    res[0] = 0;
    return res;
}
 
 
vector<m32> expFPS(const vector<m32>& A, int n){
    vector<m32> res = {1};
    while(res.size() < n){
        int z = res.size();
        auto tmp = logFPS(res,z*2);
        tmp[0] = m32(0) - 1;
        rep(i,min<int>(z*2,A.size())) tmp[i] = A[i] - tmp[i];
        res = atcoder::convolution(res, tmp);
        res.resize(min(n,2*z));
    }
    return res;
}


vector<m32> powFPS(const vector<m32>& A, u64 k){
    int n = A.size();
    int zerocnt = 0;
    rep(i,n) if(A[i] == 0) zerocnt = i+1; else break;
    if(zerocnt >= (n-1)/k+1) return vector<m32>(n,0);
    auto res = A;
    rep(i,n-zerocnt) res[i] = res[i+zerocnt];
    m32 A0 = res[0];
    m32 iA0 = A0.inv();
    m32 pA0 = A0.pow(k);
    rep(i,n) res[i] *= iA0;
    res = logFPS(res,n);
    rep(i,n) res[i] *= k;
    res = expFPS(res,n);
    rep(i,n) res[i] *= pA0;
    zerocnt *= k;
    res.resize(n);
    for(int i=n-1; i>=zerocnt; i--) res[i] = res[i-zerocnt];
    rep(i, zerocnt) res[i] = 0;
    return res;
}


int main(){
    u64 x,y; cin >> x >> y;
    if(x > y) swap(x,y);
    auto G3 = invFPS({1,MOD-1}, x+1);
    vector<m32> G = convolution({1,2}, invFPS({1,MOD-1}, x+1));
    G.resize(x+1, 0);
    
    auto B = powFPS(G, y);
    rep(i,x) B[i+1] += B[i];
    
    auto G2 = invFPS(G, x+1);
    reverse(G2.begin(), G2.end());
    G2.push_back(0);
    reverse(G2.begin(), G2.end());

    B = convolution(B, powsumFPS(G2, x+1));
    m32 ans = B[x];
    cout << ans.val() << endl;
    return 0;
}




struct ios_do_not_sync {
    ios_do_not_sync() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    }
} ios_do_not_sync_instance;

0