随机化秒了
注意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;
}

京公网安备 11010502036488号