QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#859979#9735. Japanese BandsZawosWA 397ms41452kbC++203.2kb2025-01-18 09:13:182025-01-18 09:13:19

Judging History

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

  • [2025-01-18 23:34:05]
  • hack成功,自动添加数据
  • (/hack/1459)
  • [2025-01-18 09:13:19]
  • 评测
  • 测评结果:WA
  • 用时:397ms
  • 内存:41452kb
  • [2025-01-18 09:13:18]
  • 提交

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],evil[21],ev[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,ev[i] = 0;
        FOR(i,0,m) evil[i] = 0;
        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 = 0; i < (1<<m);i++){
            for(int j = 0; j < m; j++) if(i&(1<<j)) ev[i] |= evil[j];
        }
        vector<ll> DP((1<<m));
        mask ^= avoid;
        for(int i = 0; i<(1<<m); ++i){
            if((i&avoid) != 0) continue;
            int comp = mask^i;
            if((ev[i]&comp) == ev[i]) DP[i] = f1(__builtin_popcount(i));
        }
        for(int i = 0;i < m; ++i) for(int msk = 0; msk < (1<<m); ++msk){
            if(msk & (1<<i)){
                DP[msk] += DP[msk^(1<<i)];
                if(DP[msk] >= MOD) DP[msk] -= MOD;
            }
        }


        for(int i = mask;; i = (i-1)&mask){
            int comp = mask^i;
            if((ev[i]&comp) != ev[i]){
                if(i == 0)break;
                else continue;
            }
            ll temp = DP[comp];
            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: 7908kb

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: -100
Wrong Answer
time: 397ms
memory: 41452kb

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:

636183812
5
428846437
319629510
798821743
1
166368670
763547450
1
269113412
422574274
1
0
170356738
233247221
957020465
745990640
318319279
862171811
620014201
0
487514263
794289871
682615629
16
111287358
664871082
727098771
1
150690843
137099259
133209264
0
85870218
1
522718622
610797213
1
1
276492...

result:

wrong answer 1st lines differ - expected: '724920553', found: '636183812'