QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#753285#9735. Japanese BandsGolem__TL 733ms3904kbC++208.6kb2024-11-16 12:10:122024-11-16 12:10:12

Judging History

你现在查看的是最新测评结果

  • [2025-01-18 23:34:05]
  • hack成功,自动添加数据
  • (/hack/1459)
  • [2024-11-16 12:10:12]
  • 评测
  • 测评结果:TL
  • 用时:733ms
  • 内存:3904kb
  • [2024-11-16 12:10:12]
  • 提交

answer

// [Irelia]
#include<bits/stdc++.h>

namespace Irelia // [Irelia Library] Irelia
{
    #define Irelia__ 201307
    #define fcc(i, j, k) for(num (i)=(j); (i)<=(k); ++(i))
    #define ccf(i, j, k) for(num (i)=(j); (i)>=(k); --(i))
    #define I (*this)
    #define same_type(T1, T2) (std::is_same<T1, T2>::value)
    #define num_type(T) (same_type(T, num) || same_type(T, Num))
    #define fra_type(T) (same_type(T, fra) || same_type(T, Fra))
    #define num_or_fra_type(T) (num_type(T) || fra_type(T))

    using num = int;
    using Num = long long;
    using unum = unsigned int;
    using uNum = unsigned long long;
    using fra = double;
    using Fra = long double;
    using pnum = std::pair<num, num>;
    using pNum = std::pair<Num, Num>;
    template<typename T>
    using heap = std::priority_queue<T, std::vector<T>, std::greater<T>>;

    const char newl = '\n', *snewl = " \n";

    constexpr Num read()
    {
        Num ret = 0, s = 1, c = getchar();
        for(; !isdigit(c); c = getchar()) if(c == '-') s = -1;
        for(; isdigit(c); c = getchar()) ret = (ret << 1) + (ret << 3) + (c ^ 48);
        return s * ret;
    }
    constexpr std::string readstr()
    {
        std::string ret; char c;
        for(; (c = getchar()) <= ' ';);
        for(; c > ' '; c = getchar()) ret += c;
        return ret;
    }
    template<typename T>
    constexpr void min_(T &a, auto &&b) { if(b < a) a = b; }
    template<typename T>
    constexpr void max_(T &a, auto &&b) { if(a < b) a = b; }
    template<typename Tnf> requires num_or_fra_type(Tnf)
    constexpr Tnf inf() { return (std::numeric_limits<Tnf>::max() - Irelia__) / 2; }
    template<typename Tn> requires num_type(Tn)
    constexpr Tn lowbit(Tn i) { return i & -i; }

    template<typename T>
    class vector : private std::vector<T>
    {
        public:
        using iterator = std::vector<T>::iterator;
        iterator begin() { return std::vector<T>::begin(); }
        iterator end() { return std::vector<T>::end(); }

        vector() { }
        vector(num siz) : std::vector<T>(siz) { }
        vector(num siz, auto &&t) : std::vector<T>(siz, t) { }
        vector(std::initializer_list<T> il) : std::vector<T>(il) { }
        vector(T *pb, T *pe) : std::vector<T>(pb, pe) { }
        vector(iterator itb, iterator ite) : std::vector<T>(itb, ite) { }

        void clear() { std::vector<T>::clear(); }
        operator bool () { return !I.empty(); }
        num size() { return std::vector<T>::size(); }
        vector &set(num siz) { return I.resize(siz), I; }
        T &front() { return std::vector<T>::front(); }
        T &back() { return std::vector<T>::back(); }
        T &operator [] (num i)
        {
            #ifdef DEBUG__
            assert(0 <= i && i < size());
            #endif
            return std::vector<T>::operator[](i);
        }
        void push(auto &&...t) { I.emplace_back(t...); }
        void insert(num i, auto &&...t) { I.emplace(begin() + i, t...); }
        void pop() { I.pop_back(); }
        void erase(num i) { std::vector<T>::erase(begin() + i); }
        void fill(auto &&t) { std::fill(begin(), end(), t); }
        void reverse() { std::reverse(begin(), end()); }
        template<typename Tcom = std::less<T>>
        void sort() { std::sort(begin(), end(), Tcom()); }
        template<typename Tcom = std::less<T>>
        num lower(auto &&t) { return std::lower_bound(begin(), end(), t, Tcom()) - begin(); }
        template<typename Tcom = std::less<T>>
        num upper(auto &&t) { return std::upper_bound(begin(), end(), t, Tcom()) - begin(); }
        template<typename Tcom = std::less<T>>
        void discretize()
        {
            sort<Tcom>(), set(std::unique(begin(), end(),
                [&](T &a, T &b) { return !Tcom()(a, b) && !Tcom()(b, a); }) - begin());
        }
    };

    #define every(e, G, o) for(num (e)=(G).las[(o)]; (e); (e)=(G).pre[(e)])
    template<typename Tn> requires num_type(Tn)
    class graph
    {
        public:
        num V, E; vector<num> las, pre, to, fro; vector<Tn> wei, cap;

        graph(num V = 0) : V(V), E(0), las(V + 1), pre(2), to(2), fro(2), wei(2), cap(2) { }

        void add(num u, num v, Tn w = 0, Tn c = 0)
        { pre.push(las[u]), las[u] = ++E + 1, to.push(v), fro.push(u), wei.push(w), cap.push(c); }
        void addb(num u, num v, Tn w = 0, Tn c = 0) { add(u, v, w, c), add(v, u, w, c); }
    };
}

namespace Irelia // [Irelia Library] modulus
{
    template<num mod>
    class modnum
    {
        private:
        num i;

        public:
        modnum(num i = 0) : i(i) { }

        num operator () () { return i; }
        modnum &operator ++ () { if(++i == mod) i = 0; return I; }
        modnum operator ++ (num) { modnum ret = I; return ++I, ret; }
        modnum operator + (modnum m) { num ret = i + m.i; if(ret >= mod) ret -= mod; return ret; }
        modnum &operator += (modnum m) { if((i += m.i) >= mod) i -= mod; return I; }
        modnum &operator -- () { if(!i--) i = mod - 1; return I; }
        modnum operator -- (num) { modnum ret = I; return --I, ret; }
        modnum operator - (modnum m) { num ret = i - m.i; if(ret < 0) ret += mod; return ret; }
        modnum &operator -= (modnum m) { if((i -= m.i) < 0) i += mod; return I; }
        modnum operator * (modnum m) { return 1ULL * i * m.i % mod; }
        modnum &operator *= (modnum m) { return i = 1ULL * i * m.i % mod, I; }
        modnum operator / (modnum m) { return I * m.inv(); }
        modnum &operator /= (modnum m) { return I *= m.inv(); }
        modnum power(num e)
        { modnum ret = 1, d = I; for(; e; e >>= 1, d *= d) if(e & 1) ret *= d; return ret; }
        modnum inv() { return power(mod - 2); }
        friend std::ostream &operator << (std::ostream &os, modnum m) { return std::cout << m.i; }
    };
}

using namespace Irelia;

const num mod = 1E9 + 7;
using Mod = modnum<mod>;
void solve()
{
    num N1 = read(), N2 = read(), M = read(), K = read(), mas = (1 << M) - 1;
    vector<num> A(K + 1), B(K + 1), con(M + 1);
    fcc(i, 1, K) A[i] = read(), B[i] = read(), con[A[i]] = con[B[i]] = 1;
    num adj[21][401] = { }, cou[21] = { };
    fcc(i, 1, K) adj[A[i]][++cou[A[i]]] = B[i], adj[B[i]][++cou[B[i]]] = A[i];
    num ncon = 0;
    fcc(i, 1, M) if(!con[i]) ++ncon;
    vector<vector<Mod>> dp(M + 1, vector<Mod>(M + 1));
    fcc(s, 0, mas)
    {
        vector<num> vis(M + 1);
        std::function<pnum(num, num)> DFS = [&](num o, num c)
        {
            pnum ret; vis[o] = c, ++(c == 2 ? ret.first : ret.second);
            fcc(i, 1, cou[o])
            {
                num v = adj[o][i];
                if(vis[v] == c) return pnum(-1, -1);
                else if(!vis[v] && !(s >> v - 1 & 1))
                {
                    pnum pa = DFS(v, c ^ 1);
                    if(pa.first < 0) return pnum(-1, -1);
                    ret.first += pa.first, ret.second += pa.second;
                }
            }
            return ret;
        };
        num N = 0, ma = 0, sum = 0, bc = std::popcount<unum>(s), ok = 1;
        fcc(i, 1, M) if(!con[i] && s >> i - 1 & 1)
        {
            ok = 0;
            break;
        }
        if(!ok) continue;
        vector<pnum> P(1);
        fcc(i, 1, M) if(con[i] && !vis[i] && !(s >> i - 1 & 1))
        {
            ++N, P.push(DFS(i, 2));
            sum += P[N].first + P[N].second;
            ma += std::max(P[N].first, P[N].second);
            if(P[N].first < 0)
            {
                ok = 0;
                break;
            }
        }
        if(!ok) continue;
        vector<Mod> dp2(ma + 1); dp2[0] = 1;
        auto get = [&](num i) { return i >= 0 ? dp2[i] : Mod(0); };
        fcc(i, 1, N) ccf(j, ma, 0) dp2[j] = get(j - P[i].first) + get(j - P[i].second);
        fcc(j, 0, ma) dp[j + bc][sum - j + bc] += dp2[j];
    }
    fcc(i, 1, ncon) ccf(j, M, 0) ccf(k, M, 0)
    {
        if(j) dp[j][k] += dp[j - 1][k];
        if(k) dp[j][k] += dp[j][k - 1];
        if(j && k) dp[j][k] += dp[j - 1][k - 1];
    }
    auto bin = [&](num i, num j)
    {
        Mod ret = 1;
        fcc(k, 1, j) ret = ret * (i - k + 1) / k;
        return ret;
    };
    Mod ans = 0;
    fcc(i, 1, std::min(N1, M)) fcc(j, 1, std::min(N2, M))
        ans += bin(N1 - 1, i - 1) * bin(N2 - 1, j - 1) * dp[i][j];
    std::cout << ans << newl;
}
num main()
{
    #ifndef ONLINE_JUDGE
    freopen(".in", "r", stdin);
    freopen(".out", "w", stdout);
    #endif
    std::ios::sync_with_stdio(0), std::cin.tie(0);

    for(num T = read(); T --> 0;) solve();
    return 0 ^ 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3652kb

input:

3
2 3 3 3
2 3
1 1
2 3
2 2 2 1
1 1
1 1 10 2
1 2
1 3

output:

6
4
0

result:

ok 3 lines

Test #2:

score: 0
Accepted
time: 733ms
memory: 3640kb

input:

500
481199252 336470888 8 58
4 7
7 6
4 7
2 6
2 6
2 7
8 3
8 7
8 1
2 6
2 6
1 2
1 5
3 1
6 4
2 4
4 7
2 6
2 3
7 1
4 4
5 1
2 7
6 7
8 1
8 7
5 6
4 2
4 2
8 5
5 4
6 8
5 6
3 8
1 7
1 6
7 1
5 6
6 3
1 1
2 7
3 3
1 5
5 5
8 7
3 4
6 3
8 8
7 4
1 6
2 1
8 7
4 5
2 7
3 5
2 6
4 5
4 3
2 6 2 2
2 1
1 1
500330171 987581927 10 ...

output:

724920553
11
966099120
846759476
528107862
1
245313614
144990327
1
269113412
946380890
1
0
996348464
376698469
453289929
53346774
238565800
260837053
956196844
0
487514263
842710229
8376584
16
300260118
933415828
808801372
1
612901047
137099259
14974173
0
531418108
1
522718622
264859767
1
1
59318545...

result:

ok 500 lines

Test #3:

score: 0
Accepted
time: 619ms
memory: 3648kb

input:

500
54748096 75475634 8 64
3 8
3 2
3 5
5 6
5 7
5 4
2 2
5 8
5 3
3 5
7 6
1 7
3 3
6 8
3 5
3 4
1 2
7 5
7 6
4 7
8 7
7 5
4 2
3 2
8 5
7 1
4 3
4 6
3 3
8 3
6 1
5 4
1 4
2 3
5 6
1 4
5 8
8 2
1 3
8 1
5 7
1 2
3 8
4 2
5 4
7 2
4 6
5 8
4 6
3 5
5 7
4 6
4 8
6 4
7 4
3 3
5 2
1 6
4 5
3 1
1 4
5 6
4 3
3 1
44007561 94403501...

output:

48662676
1
138912221
349671067
150052712
86775188
956490545
756234965
1
567881550
726030753
1
914856825
867349578
0
784807018
388018114
433007753
524010032
507842496
282218203
442034917
668340856
1
1
1
489645337
153477090
564466420
1673
0
390234222
604892803
264163973
601602052
135055881
27720
15744...

result:

ok 500 lines

Test #4:

score: 0
Accepted
time: 719ms
memory: 3904kb

input:

500
923264237 374288891 9 36
8 8
5 8
3 6
2 4
2 6
4 7
3 8
3 4
5 5
5 1
9 3
1 9
5 4
5 8
4 3
2 8
7 6
7 3
8 9
3 4
4 1
8 1
7 3
6 3
6 2
9 6
2 3
2 5
6 1
8 5
4 5
3 1
8 7
6 5
3 2
1 1
885955146 964950238 8 59
1 3
7 7
8 1
2 7
6 5
1 3
1 2
2 3
1 2
8 2
4 1
5 6
5 8
3 1
8 3
2 3
8 3
6 5
2 5
6 7
7 2
6 3
6 5
6 7
7 8
8 ...

output:

975815187
715739872
849684680
940532257
1
181582862
672614348
487379998
1
872849956
969457677
827780523
98088
1
496360790
568133531
231661973
1
981238143
13510
8
663802864
252
107191472
18522
415132978
697199493
116414735
1
10
912343690
81
583097677
223080594
33251656
117275734
1
419400938
630591794...

result:

ok 500 lines

Test #5:

score: -100
Time Limit Exceeded

input:

500
1 9 7 21
4 3
4 5
4 3
4 5
4 5
4 7
4 7
4 2
4 3
4 6
4 1
4 7
4 5
4 1
4 2
4 2
4 2
4 1
4 2
4 6
4 6
192019400 315755530 10 56
8 10
9 7
9 6
8 4
3 4
1 6
8 7
9 10
8 7
5 7
2 4
5 7
1 6
9 7
2 4
1 4
2 7
5 7
5 7
2 10
3 7
8 4
8 4
3 4
5 7
9 6
2 10
3 4
8 10
9 4
5 10
2 4
8 7
5 4
5 7
9 4
8 6
1 7
5 4
8 10
3 4
9 7
8 ...

output:


result: