QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#859979 | #9735. Japanese Bands | Zawos | WA | 397ms | 41452kb | C++20 | 3.2kb | 2025-01-18 09:13:18 | 2025-01-18 09:13:19 |
Judging History
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'