题目入口
思路
我们发现,每一次先消去的是最小的人,观察最后留下的两个不同的数,一定是最大的和次大的,并且我们发现,若最大的数个数多于两个,最后一定是在那几个数中循环,此时答案无关排列位置,就是n!,而当最大的数只有一个,以4 3 3 为例,只有当3 3 4时不合法,其余都合法,即最大数在所有次大数后面时不合法,答案用所有排列数减去不合法数即可
(刚开始怕爆long long,用来qmul,结果反而tle了第8个点)
代码
#include#define int long long using namespace std; int t; const int N=2e5+10,mod=998244353; int fac[N]; int a[N]; unordered_map mp; int qmul(int a,int n) { int res=0; while(n) { if(n&1) res=(res+a)%mod; a=2*a%mod; n>>=1; } return res; } int qpow(int a,int n) { int res=1; while(n) { if(n&1) res=res*a%mod; a=a*a%mod; n>>=1; } return res; } void init() { fac[0]=1; for(int i=1;i<=N-5;i++) fac[i]=fac[i-1]*i%mod; } int C(int a,int b) { int res=1; for(int i=1,j=a;i<=b;i++,j--) { res*=j; res%=mod; res*=qpow(i,mod-2); res%=mod; } return res; } int A(int a,int b) { return C(a,b)*fac[b]%mod; } signed main() { init(); cin>>t; while(t--) { mp.clear(); int n; cin>>n; int maxx=-1; for(int i=1;i<=n;i++) { cin>>a[i]; mp[a[i]]++; if(maxx=2) cout< max2+1) cout<<"0"<



