結果

問題 No.723 2つの数の和
ユーザー karinohitokarinohito
提出日時 2022-11-08 17:12:23
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 4,922 bytes
コンパイル時間 4,659 ms
コンパイル使用メモリ 268,752 KB
実行使用メモリ 6,896 KB
最終ジャッジ日時 2023-09-29 06:53:14
合計ジャッジ時間 6,510 ms
ジャッジサーバーID
(参考情報)
judge11 / judge14
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 20 ms
6,572 KB
testcase_01 AC 20 ms
6,612 KB
testcase_02 AC 20 ms
6,560 KB
testcase_03 AC 26 ms
6,724 KB
testcase_04 AC 29 ms
6,636 KB
testcase_05 AC 29 ms
6,736 KB
testcase_06 AC 28 ms
6,772 KB
testcase_07 AC 24 ms
6,740 KB
testcase_08 AC 24 ms
6,568 KB
testcase_09 AC 29 ms
6,728 KB
testcase_10 AC 24 ms
6,660 KB
testcase_11 AC 22 ms
6,636 KB
testcase_12 AC 26 ms
6,556 KB
testcase_13 AC 30 ms
6,560 KB
testcase_14 AC 22 ms
6,720 KB
testcase_15 AC 24 ms
6,728 KB
testcase_16 AC 26 ms
6,716 KB
testcase_17 AC 28 ms
6,668 KB
testcase_18 WA -
testcase_19 WA -
testcase_20 AC 21 ms
6,808 KB
testcase_21 AC 20 ms
6,660 KB
testcase_22 AC 20 ms
6,632 KB
testcase_23 AC 29 ms
6,744 KB
testcase_24 AC 24 ms
6,560 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
#include <atcoder/all>
using namespace atcoder;
using ll = long long;
using vll = vector<ll>;
using vvll = vector<vll>;
using vvvll = vector<vvll>;
using vvvvll = vector<vvvll>;
using vvvvvll = vector<vvvvll>;
using vvvvvvll = vector<vvvvvll>;
using vb = vector<bool>;
using vvb = vector<vb>;
using vvvb = vector<vvb>;
using vvvvb = vector<vvvb>;
using vd = vector<double>;
using vvd = vector<vd>;
using vvvd = vector<vvd>;
using vvvvd = vector<vvvd>;
using vvvvvd = vector<vvvvd>;
#define all(A) A.begin(),A.end()
#define ALL(A) A.begin(),A.end()
#define rep(i, n) for (ll i = 0; i < (ll) (n); i++)
using pqr = priority_queue<pair<ll, ll>, vector<pair<ll, ll>>, greater<pair<ll, ll>>>;
#define tN(t) (t==1?XN:YN)
#define tS(t) (t==1?XS:YS)
#define tA(t) (t==1?XA:YA)

template<class T>
bool chmax(T& p, T q, bool C = 1) {
    if (C == 0 && p == q) {
        return 1;
    }
    if (p < q) {
        p = q;
        return 1;
    }
    else {
        return 0;
    }
}

template<class T>
bool chmin(T& p, T q, bool C = 1) {
    if (C == 0 && p == q) {
        return 1;
    }
    if (p > q) {
        p = q;
        return 1;
    }
    else {
        return 0;
    }
}

ll gcd(ll(a), ll(b)) {
    if (b == 0)return a;
    ll c = a;
    while (a % b != 0) {
        c = a % b;
        a = b;
        b = c;
    }
    return b;
}
ll sqrtz(ll N) {
    ll L = 0;
    ll R = sqrt(N) + 10000;
    while (abs(R - L) > 1) {
        ll mid = (R + L) / 2;
        if (mid * mid <= N)L = mid;
        else R = mid;
    }
    return L;

}

vector<ll> fact, factinv, inv;
const ll mod = 1e9 + 7;
void prenCkModp(ll n) {
    fact.resize(n + 5);
    factinv.resize(n + 5);
    inv.resize(n + 5);
    fact[1] = fact[1] = 1;
    factinv[1] = factinv[1] = 1;
    inv[1] = 1;
    for (ll i = 2; i < n + 5; i++) {
        fact[i] = (fact[i - 1] * i) % mod;
        inv[i] = mod - (inv[mod % i] * (mod / i)) % mod;
        factinv[i] = (factinv[i - 1] * inv[i]) % mod;
    }

}

ll nCk(ll n, ll k) {
    if (n < k) return 0;
    return fact[n] * (factinv[k] * factinv[n - k] % mod) % mod;
}


/*
形式的冪級数
Fに係数を昇順に入っている.

ACLのatcoder/allが入っている想定

*/
using mint =modint998244353;
template<class T>
struct Formal_Power_Series{
    using FPS =Formal_Power_Series;
    //using vector<T>::vect;
    // using vector<T>::operator=;
    vector<T> F;
    //int deg;
    Formal_Power_Series(int num) :F(num + 1, 0){}
    Formal_Power_Series(vector<T> V) :F(V){}
    
    FPS operator-() const{
        FPS res(*this);
        for(auto &e: res.F)e=-e;
        return res;
    }//-1倍
    FPS& operator*=(const T& g) {
        for (auto& e : *this.F) e *= g;
        return *this;
    }//スカラー倍
    FPS& operator/=(const T& g) {
        assert(g != T(0));
        *this *= g.inv();
        return *this;
    }//スカラー除
    FPS& operator+=(const FPS& g) {
        int n = (*this).F.size(), m = g.F.size();
        rep(i, min(n, m)) (*this).F[i] += g.F[i];
        return *this;
    }//加法
    FPS& operator-=(const FPS& g) {
        return *this+=(-g);
    }//減法//

    FPS& operator*=(const FPS& g){
        (*this).F = convolution((*this).F,g.F);
        return *this;
    }
    /*
    FPS& operator<<=(const int d) {
        int n = (*this).size();
        (*this).insert((*this).begin(), d, 0);
        (*this).resize(n);
        return *this;
    }//分からん

    FPS& operator>>=(const int d) {
        int n = (*this).size();
        (*this).erase((*this).begin(), (*this).begin() + min(n, d));
        (*this).resize(n);
        return *this;
    }//分からん2


    FPS inv(int d = -1) const {
        int n = (*this).size();
        assert(n != 0 && (*this)[0] != 0);
        if (d == -1) d = n;
        assert(d > 0);
        FPS res{ (*this)[0].inv() };
        while (res.size() < d) {
            int m = size(res);
            FPS f(begin(*this), begin(*this) + min(n, 2 * m));
            FPS r(res);
            f.resize(2 * m), internal::butterfly(f);
            r.resize(2 * m), internal::butterfly(r);
            rep(i, 2 * m) f[i] *= r[i];
            internal::butterfly_inv(f);
            f.erase(f.begin(), f.begin() + m);
            f.resize(2 * m), internal::butterfly(f);
            rep(i, 2 * m) f[i] *= r[i];
            internal::butterfly_inv(f);
            T iz = T(2 * m).inv(); iz *= -iz;
            rep(i, m) f[i] *= iz;
            res.insert(res.end(), f.begin(), f.begin() + m);
        }
        return { res.begin(), res.begin() + d };
    }
    */


};
using FPS =Formal_Power_Series<mint>;
int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);

    ll N,X;
    cin>>N>>X;
    vector<mint> F(1e5+1,0);
    rep(i,N){
        ll A;
        cin>>A;
        F[A]++;
    }
    FPS D(F);
    D*=D;
    if(D.F.size()<=X)cout<<0<<endl;
    else cout<<D.F[X].val()<<endl;

}
0