CF1777B题解
时间复杂度为 O(n+t) 的解法
这道题本来是很简单的,但是考场上看漏了“所有
闲话少说,让我们来看看这道题。非常容易想出一种暴力的做法,时间复杂度为
我们可以尝试找找规律:
当
当
-
1,2:反转得到1,2,2,1,共有2 个逆序对。 -
2,1:反转得到2,1,1,2,共有2 个逆序对。
当
-
1,2,3:反转得到1,2,3,3,2,1,共有6 个。 -
1,3,2:反转得到1,3,2,2,3,1,共有6 个。 -
……
等一下,我们发现长度固定的
那么我们只需要找其中一个
但是显然,这个时间复杂度仍不让人满意。那有没有更快的方法呢?我们通过更多的枚举可以发现长度为
因为
但是,但是,我不是说有
考场代码:
#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9+7;
const int MAXN = 1e5+1;
long long t, n, x = 1;
long long f[MAXN];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
for (int i=1; i<MAXN; i++){
x = (x*i)%MOD;
f[i] = x;
}
cin >> t;
while (t--){
cin >> n;
cout << (f[n]*(n-1)%MOD)*n%MOD << '\n';
}
return 0;
}
我自己也搞了一道题,和这道题数据范围的区别。各位可以尝试用上面的方法做一下。