QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#859916#9735. Japanese BandsZawosTL 529ms23524kbC++203.4kb2025-01-18 08:26:552025-01-18 08:27:06

Judging History

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

  • [2025-01-18 23:34:05]
  • hack成功,自动添加数据
  • (/hack/1459)
  • [2025-01-18 08:27:06]
  • 评测
  • 测评结果:TL
  • 用时:529ms
  • 内存:23524kb
  • [2025-01-18 08:26:55]
  • 提交

answer

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define FOR(i,a,b) for (int i = (a); i < (b); i++)
using namespace std;
using namespace __gnu_pbds;
using ll=long long;
using ld=long double;
using vi=vector<int>;
template<class T> using oset =tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update> ;
//上
ll n1,n2,m,k,M;
ll F1[1<<21],F2[1<<21];
const ll MOD = 1e9+7;
ll binpow(ll a,ll b){
    ll ans = 1;
    ll mul = a;
    while(b){
        if(b&1LL) ans = ans*mul%MOD;
        mul = mul*mul%MOD;
        b>>=1LL;
    }
    return ans;
}
ll f2(ll m1){
    if(F2[m1] != -1) return F2[m1];
    ll b = m-m1-1;
    ll a = n2-1+m-M;
    if(a <0 || b <0 ||a-b < 0) return 0;
    ll mul = 1;
    ll div = 1;
    for(ll i = a-b+1; i <= a;i++) mul = mul*i%MOD;
    for(ll i = 1; i <= b;i++) div = div*i%MOD;
    div = binpow(div,MOD-2);
    return F2[m1]=mul*div%MOD;
}
ll f1(ll m2){
    if(F1[m2] != -1) return F1[m2];
    ll b = m-m2-1;
    ll a = n1-1+m-M;
    if(a <0 || b <0 ||a-b < 0) return 0;
    ll mul = 1;
    ll div = 1;
    for(ll i = a-b+1; i <= a;i++) mul = mul*i%MOD;
    for(ll i = 1; i <= b;i++) div = div*i%MOD;
    div = binpow(div,MOD-2);
    return F1[m2]=mul*div%MOD;
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int t;
    cin >> t;
    while(t--){

        cin >> n1 >> n2 >> m >> k;
        vector<pair<ll,ll>> v(k);
        FOR(i,0,(1<<m)) F1[i] = -1,F2[i] = -1;
        FOR(i,0,k) cin >> v[i].first >> v[i].second;
        int mask = 0;
        FOR(i,0,k){
            mask |=(1<<(v[i].first-1));
            mask |=(1<<(v[i].second-1));
        }
        M = __builtin_popcount(mask);
        vector<ll> evil(m);
        int avoid = 0;
        for(int i = 0; i < m;i++){
            for (int j = 0; j < k; j++){
                if(v[j].first == v[j].second) avoid |= (1<<(v[j].first-1));
                else if(v[j].first-1 == i) evil[i] |= (1<<(v[j].second-1));
                else if(v[j].second-1== i) evil[i] |= (1<<(v[j].first-1));
            }
        }
        //m1
        ll ans = 0;

        for(int i = mask;; i = (i-1)&mask){
            if((i&avoid)!=0){
                if(i == 0)break;
                else continue;
            }
            int comp = mask^i;
            int ev = 0;
            for(int j = 0; j < m; j++){
                if(i&(1<<j)) ev |= evil[j];
            }
            if((ev&comp) != ev){
                if(i == 0)break;
                else continue;
            }
            ll temp = 0;
            for(int j = comp;; j= (j-1)&comp){
                if((j&avoid)!=0){
                if(j == 0)break;
                else continue;
            }
                int co = mask^j;
                ev = 0;
                for(int kk = 0; kk < m; kk++){
                    if(j&(1<<kk)) ev |= evil[kk];
                }
                if((ev&co) != ev){
                    if(j == 0)break;
                    else continue;
                }
                // cout << i<<" "<<j<<'\n';
                temp +=f1(__builtin_popcount(j));
                if(temp >= MOD) temp -=MOD;
                if(j == 0) break;
            }
            ans += f2(__builtin_popcount(i))*temp;
            ans %=MOD;
            if(i == 0) break;
        }
        cout <<ans <<'\n';

    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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: 529ms
memory: 23524kb

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: 79ms
memory: 23244kb

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: 128ms
memory: 23428kb

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: