QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#771337#9735. Japanese BandsSGColinWA 451ms12052kbC++202.1kb2024-11-22 11:52:322024-11-22 11:52:39

Judging History

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

  • [2025-01-18 23:34:05]
  • hack成功,自动添加数据
  • (/hack/1459)
  • [2024-11-22 11:52:39]
  • 评测
  • 测评结果:WA
  • 用时:451ms
  • 内存:12052kb
  • [2024-11-22 11:52:32]
  • 提交

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=(1ll*ans+m1[i]*m2[j])%mod;
        }
        printf("%d\n",ans);

    }

    return 0;
}

詳細信息

Test #1:

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

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: 451ms
memory: 12052kb

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:

442693601
11
156956225
-390119605
361424094
1
-385407756
330202800
1
-123882840
788820252
1
0
547258985
-678438956
-339787446
735294986
-83903634
-783778716
-86221587
0
294285321
-206171347
387708282
16
624508534
-563893148
766854751
1
-278962062
427629686
474763153
0
779844158
1
-851701371
74848426...

result:

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