QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#859045 | #9735. Japanese Bands | wangjinbo | WA | 325ms | 23224kb | C++20 | 2.8kb | 2025-01-17 13:52:11 | 2025-01-17 13:52:13 |
Judging History
answer
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<set>
#include<vector>
#include<map>
#include<queue>
#define int long long
using namespace std;
const int N=405,M=2e6+10,mod=1e9+7;
int n1,n2,m,k,a[N],b[N],f[M],g[M],id[22],n,inv[22];
bool used[22];
int C1[22],C2[22];
void clear(){
for(int j=0;j<(1<<m);j++)f[j]=g[j]=0;
for(int i=0;i<=m;i++){
used[i]=0;
}
}
inline void inc(int &x,int y){
x=(x+y)%mod;
}
int qpow(int a,int b,int mod){
if(!b)return 1;
int t=qpow(a,b/2,mod);
if(b&1)return t*t%mod*a%mod;
else return t*t%mod;
}
int C(int n,int m){
if(m<0)return 0;
int res=inv[m];
while(m){
res=res*n%mod;
n--;m--;
}
return res;
}
void fwt(int *a,int op){
for(int o=2,k=1;o<=(1<<n);o<<=1,k<<=1){
for(int i=0;i<(1<<n);i+=o){
for(int j=0;j<k;++j){
if(op==1)a[i+j+k]+=a[i+j];
else a[i+j+k]-=a[i+j];
}
}
}
for(int i=0;i<(1<<n);i++)a[i]=(a[i]%mod+mod)%mod;
}
inline int read(){
int x=0,w=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
while('0'<=c&&c<='9')x=x*10+c-'0',c=getchar();
return x*w;
}
signed main(){
//freopen("J.in","r",stdin);
int T=read();
inv[0]=1;
for(int i=1;i<=20;i++)inv[i]=inv[i-1]*qpow(i,mod-2,mod)%mod;
while(T--){
n1=read(),n2=read(),m=read(),k=read();
for(int i=1;i<=k;i++){
a[i]=read(),b[i]=read();
used[a[i]]=used[b[i]]=1;
}
int cnt=0;
for(int i=1;i<=m;i++){
if(used[i])id[i]=cnt++;
}
n=cnt;
for(int i=1;i<=n;i++){
a[i]=id[a[i]],b[i]=id[b[i]];
}
for(int i=0;i<(1<<n);i++){
int t=__builtin_popcount(i);
int w=m-n;
f[i]=C(n1+w-1,m-t-1);g[i]=C(n2+w-1,m-t-1);
for(int j=1;j<=k;j++){
if(((i>>a[j])&1)&&((i>>b[j])&1)){
f[i]=g[i]=0;break;
}
}
}
//printf("%.2f\n",(double)clock()/CLOCKS_PER_SEC);
fwt(f,1);
int ans=0;
for(int i=0;i<(1<<n);i++){
inc(ans,g[i]*f[(1<<n)-1-i]);
}
/*for(int i=0;i<=n;i++){
for(int j=0;j<(1<<n);j++){
for(int k=0;k<=i;k++){
inc(h[i][j],f[k][j]*g[i-k][j]);
}
}
fwt(h[i],-1);
}
int ans=0;
for(int i=0;i<(1<<n);i++){
int t=__builtin_popcount(i);
inc(ans,h[t][i]);
}*/
printf("%lld\n",ans);
clear();
}
//printf("%.2f\n",(double)clock()/CLOCKS_PER_SEC);
return 0;
}
/*
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
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 5796kb
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: 325ms
memory: 23224kb
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:
727636800 11 966099120 866065669 708258207 1 536799209 828600137 1 755846643 878324333 1 0 94899144 376698469 241530989 647403893 381563718 258955690 792482995 0 487514263 415023056 8376584 16 749631553 664871082 727098771 1 584611489 137099259 780813110 0 745090684 1 522718622 231626145 1 1 6009860...
result:
wrong answer 1st lines differ - expected: '724920553', found: '727636800'