码迷,mamicode.com
首页 > 编程语言 > 详细

.NET基础知识-进程与线程

时间:2020-08-10 18:32:48      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:strong   内核对象   活跃   线程调度   计算   使用   效率   system   windows系统   

题目


分析

因为第一名所在的学校一定会发喜报,
所以只有一个学校发喜报说明其它学校都没有发喜报
钦定第一名所在的学校为1,总方案要乘\(n\),那么两个1之间不可能出现两个相同的学校的学生
那么可以分成两部分,按照乘法原理,左边是在剩下的\(n-1\)个学校中选出\(i\)个进行排列,
右边是在剩下的\(2n-2-i\)个位置进行全排列,由于有\(n-i-1\)个学校需要2个位置,按照多重集的排列数还要除以\(2^{n-i-1}\)
总而言之,

\[ans=n\sum_{i=0}^{n-1}\frac{P_{n-1}^i(2n-2-i)!}{2^{n-i-1}}=n!\times \sum_{i=0}^{n-1}\frac{(2n-2-i)!}{(n-i-1)!2^{n-i-1}} \]


代码

#include <cstdio>
#define rr register
using namespace std;
const int mod=998244353,N=1000011;
int n,fac[N<<1],inv[N],two[N],ans;
inline signed mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
signed main(){
	scanf("%d",&n),fac[0]=fac[1]=inv[0]=inv[1]=two[0]=1;
	for (rr int i=2;i<=n;++i) inv[i]=1ll*inv[mod%i]*(mod-mod/i)%mod;
	for (rr int i=1;i<=n;++i) two[i]=1ll*two[i-1]*inv[2]%mod; 
	for (rr int i=2;i<=n;++i) inv[i]=1ll*inv[i-1]*inv[i]%mod;
	for (rr int i=2;i<=2*n;++i) fac[i]=1ll*fac[i-1]*i%mod;
	for (rr int i=0;i<n;++i) ans=mo(ans,1ll*fac[n*2-2-i]*two[n-i-1]%mod*inv[n-i-1]%mod);
	return !printf("%d",1ll*ans*fac[n]%mod);
}

.NET基础知识-进程与线程

标签:strong   内核对象   活跃   线程调度   计算   使用   效率   system   windows系统   

原文地址:https://www.cnblogs.com/hypo106/p/13471426.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!