欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)
文章字体风格:
红色文字表示:重难点★✔
蓝色文字表示:思路以及想法★✔
如果大家觉得有帮助的话,感谢大家帮忙
点赞!收藏!转发!
我的qq号是:1210931886,欢迎大家加群,一起学习,互相交流,共同进步✨
原题链接
这个题目简单来说,就是求1~n的所有排列组合中,存在多少对一个前面的数小于后面的数的情况
例如样例中的n = 3的情况
1,2,3…n 这n个数字中,将不同的两个数字组成一个组,这样的组一共可以组成(nn-1)/2组,这其中的每一组在每一个排列中都有出现,由于是全排列并且每一个组出现的时候,前者小于后者的概率都是1/2。所以答案就是成对的数字的组的数量 * 全排列的数量 * 1/2
而n个数字的全排列的一共有n!种
答案 = [n(n-1)]/2 * n! * 1/2
#include
using namespace std;
using ll = long long;
const ll mod = 998244353;
int main () {
ll n; cin >> n;
ll ans = 1;
//计算 阶乘除以2
for(int i = 3; i <= n; i++) {//从3开始是因为在这一步直接将2除掉了, 避免除法
ans = (ans * i) % mod;
}
//乘以C(2, n)
ans = (ans * ((n * (n - 1) / 2) % mod)) % mod;
cout << ans << endl;
return 0;
}
作者:trudbot
链接:https://www.acwing.com/solution/content/137903/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。