题解
2024-10-02 08:06:09
发布于:广东
19阅读
0回复
0点赞
思路
这道题看着比较难,实际上题干已经给了提示:乘法原理
只不过,现在每个数不能重复,这给了我们一个想法:按照一定顺序的排列去算一共有几种不同的序列
举个例子,如果ai上放了1,那么说明xi只有正整数1一种可能,而如果aj上是2,说明xj可以取1或2,但由于ai只能够让xi为1,又要求不重复,所以aj对应的xj只能填2。这样模拟的过程走下来,体现了一个思路:数越小,可能性越少,应当优先考虑数小的ai有多少种对应的数可填入xi,再考虑数大的aj有多少种xj的可能性,这样将它们可能填的数量乘起来,就是最终的结果。
代码
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
const int N=2e5+3,M=998244353;
int t,n,s,a[N],used;
signed main(){
cin>>t;
while(t--){
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
sort(a,a+n);
s=1,used=0;
for(int i=0;i<n;i++)s=(s*(a[i]-used++))%M;
cout<<s<<endl;
}
return 0;
}
这里空空如也
有帮助,赞一个