随机化秒了

注意1 1和1 1这样也算是两种组合方式,所以要反去重

#include<bits/stdc++.h>
#define int long long
#define mp make_pair
#define pb push_back
#define PII pair<int,int>
#define PDD pair<double,double>
#define all(x) x.begin(), x.end()
using namespace std;
mt19937 myrand(time(nullptr));
unordered_map<int,bool> marked;
int fac(int x){
    int ret=1;
    for(int i=2;i<=x;i++) ret*=i;
    return ret;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int n;
    cin>>n;
    vector<int> a(n),b(n);
    for(int i=0;i<n;i++) cin>>a[i];
    for(int i=0;i<n;i++) cin>>b[i];
    int win=0,tie=0,lose=0;
    vector<int> cnt(4,0);
    for(int i=0;i<n;i++){
        cnt[a[i]]++;
    }
    int offset=1;
    for(int i=0;i<=3;i++){
        offset*=fac(cnt[i]);
    }
    for(int i=1;i<=1000000;i++){
        shuffle(all(a),myrand);
        int temp=0;
        for(int j=0;j<n;j++){
            temp*=10;
            temp+=a[j];
        }
        if(marked[temp]) continue;
        marked[temp]=true;
        int res1=0,res2=0;
        for(int j=0;j<n;j++){
            if(a[j]>b[j]) res1++;
            else if(a[j]<b[j]) res2++;
        }
        if(res1>res2) win+=offset;
        else if(res1==res2) tie+=offset;
        else lose+=offset;
    }
    cout<<win<<' '<<lose<<' '<<tie<<endl;
    return 0;
}