QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#859916 | #9735. Japanese Bands | Zawos | TL | 529ms | 23524kb | C++20 | 3.4kb | 2025-01-18 08:26:55 | 2025-01-18 08:27:06 |
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];
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';
}
}
詳細信息
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 ...