一、队友拉了一场数论赛,打了三个小时,组合数,快速幂。
二、自己又刷了一道cf1300分的较难的题目。
#include<bits/stdc++.h> #define int long long #define x first #define y second #define endl '\n' #define pq priority_queue using namespace std; typedef pair<int,int> pii; //仅仅出现一次的既让p[i]=q[i] //出现两次和0次的数的个数应该相等,然后记录零次和一次的数和下标 void solve() { int n;cin>>n; vector<int>a(n); for(int i=0;i<n;i++){ cin>>a[i]; --a[i]; } vector<int>cnt(n); vector<vector<int>>at(n); for(int i=0;i<n;i++) { cnt[a[i]]+=1; at[a[i]].push_back(i); } vector<int>twos,zeros; bool ok=true; for(int i=0;i<n;i++) { if(cnt[i]==0) zeros.push_back(i); else if(cnt[i]==2) twos.push_back(i); else if(cnt[i]>2){ ok=false; break; } } if(!ok){ cout<<"NO"<<endl;return; } auto p=a; auto q=a; int k=twos.size(); for(int i=0;i<k;i++) { if(twos[i]<zeros[i]){ ok=false;break; } int v=twos[i];//存在两次的那个数 p[at[v][0]]=zeros[i]; q[at[v][1]]=zeros[i]; } if(!ok){ cout<<"NO"<<endl; }else{ cout<<"YES"<<endl; for(int i=0;i<n;i++){ cout<<p[i]+1<<' '; }cout<<endl; for(int i=0;i<n;i++){ cout<<q[i]+1<<' '; }cout<<endl; } } signed main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int t;cin>>t; while(t--) { solve(); } return 0; }