QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#771338#9735. Japanese BandsSGColinWA 436ms12140kbC++202.1kb2024-11-22 11:53:242024-11-22 11:53:25

Judging History

This is the latest submission verdict.

  • [2025-01-18 23:34:05]
  • hack成功,自动添加数据
  • (/hack/1459)
  • [2024-11-22 11:53:25]
  • Judged
  • Verdict: WA
  • Time: 436ms
  • Memory: 12140kb
  • [2024-11-22 11:53:24]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int mod=1000000007;

int m1[1<<20],m2[1<<20];

int inv[30];
int invf(int a){
    a %= mod;
    int b=mod-2;
    int res = 1;
    while (b > 0) {
        if (b & 1) res = 1ll*res * a%mod;
        a = 1ll*a * a%mod;
        b >>= 1;
    }
    return res;
}

int calc(int n,int m){
    if(m>n){return 0;}
    if(m<0){return 0;}
    int ans=1;
    for(int i=1;i<=m;i++){
        ans=1ll*ans*(n-i+1)%mod;
        ans=1ll*ans*inv[i]%mod;
    }
    return ans;
}

set<int> s1;

int arr[410][2];

int main() {
    inv[0]=1;
    for(int i=1;i<=20;i++){
        inv[i]=1ll*i*inv[i-1]%mod;
    }
    for(int i=1;i<=20;i++){
        inv[i]=invf(inv[i]);
    }
    int t;scanf("%d",&t);
    while(t--){
        int n1,n2,m,k;scanf("%d%d%d%d",&n1,&n2,&m,&k);
        s1.clear();
        memset(m1,0,sizeof(m1));
        memset(m2,0,sizeof(m2));
        memset(arr,0,sizeof(arr));
        for(int i=1;i<=k;i++){
            scanf("%d%d",&arr[i][0],&arr[i][1]);
            arr[i][0]--;arr[i][1]--;
            s1.insert(arr[i][0]);
            s1.insert(arr[i][1]);
        }
        int M=s1.size();
        bool flag=true;
        for(int i=0;i<(1<<M);i++){
            flag=true;
            int num=0,temp=i;
            while(temp){
                if(temp&1){num++;}
                temp>>=1;
            }
            for(int j=1;j<=k;j++){
                if(((i>>arr[j][0])&1)&&((i>>arr[j][1])&1)){
                    flag=false;break;
                }
            }
            if(flag){
                m1[i]=calc(n2-1+m-M,m-num-1);
                m2[i]=calc(n1-1+m-M,m-num-1);
            }
        }
        for(int j = 0; j < M; j++) 
            for(int i = 0; i < 1 << M; i++)
                if(i >> j & 1) m2[i] = (1ll*m2[i]+m2[i ^ (1 << j)])%mod;
        int ans=0;
        for(int i=0;i<(1<<M);i++){
            int j=((1<<M)-1)^i;
            ans=(ans+1ll*m1[i]*m2[j])%mod;
        }
        printf("%d\n",ans);

    }

    return 0;
}

詳細信息

Test #1:

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

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: 436ms
memory: 11960kb

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:

720504336
11
379203241
787989717
616622643
1
134364125
712571095
1
269113412
945129135
1
0
311750586
376698469
790035011
829265413
955170412
117315425
576242332
0
487514263
294022583
8376584
16
719364533
933415828
808801372
1
18777811
942153439
487314020
0
226890726
1
422884355
991462095
1
1
3495313...

result:

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