列表

详情


NC17352. Exam

描述

    高考结束啦!所以有些学校要发高考喜报,且小美发现了高考喜报的一些规律!
    A城一共有n个高中,每个高中都有2个种子选手被列入了排行榜。
    现在高考成绩出来了,高考的排名榜我们可以抽象成一个数组a,ai表示第i名属于哪个高中(假设没有同分的人)。
    众所周知,当高考成绩出来后,有一些高中会发高考喜报,且显然一个学校发高考喜报的条件是:存在一个i∈[1,2n],满足前i名中,该学校的人数严格多于其他任何一个学校(我校前i名全市领先!)。
    现在小美想知道,对于所有有可能的高考的排名榜,有几种满足只有一个学校发了高考喜报。
    两个高考排名榜a,b不同,当且仅当存在i∈[1,2n] 使得ai != bi
    由于答案可能过多,你需要将答案对998,244,353取模。

输入描述

第一行一个正整数n。
1 ≤ n ≤1,000,000

输出描述

输出满足只有一个学校发了喜报的可能性的种数对998,244,353取模后的值。

示例1

输入:

2

输出:

4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 77ms, 内存消耗: 19424K, 提交时间: 2018-08-02 10:37:40

#include<cstdio>
using namespace std;
int n,i,fac[2000005],inv[2000005],ans=0,p2[1000005];
const int mod=998244353;
int pow(int a,int b)
{
	int ans=1;
	while(b)
	{
		if(b&1)ans=1LL*ans*a%mod;
		a=1LL*a*a%mod;
		b>>=1;
	}
	return ans;
}
int main()
{
	scanf("%d",&n);
	fac[0]=1;
	for(i=1;i<=2*n;i++)fac[i]=1LL*fac[i-1]*i%mod;
	inv[2*n]=pow(fac[2*n],mod-2);
	for(i=2*n-1;i>=0;i--)inv[i]=1LL*inv[i+1]*(i+1)%mod;
	p2[0]=1;
	for(i=1;i<=n;i++)p2[i]=1LL*p2[i-1]*2%mod;
	p2[n]=pow(p2[n],mod-2);
	for(i=n-1;i>=0;i--)p2[i]=1LL*p2[i+1]*2%mod;
	for(i=0;i<n;i++)ans=(ans+1LL*fac[2*n-2-i]*inv[n-1-i]%mod*p2[n-1-i])%mod;
	ans=1LL*ans*n%mod*fac[n-1]%mod;
	printf("%d\n",ans);
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 15ms, 内存消耗: 388K, 提交时间: 2018-07-31 17:47:30

#include<cstdio>
const int mod=998244353;
int main(){
    int n,ans=1;scanf("%d",&n);
    for(int i=2;i<=n;i++)ans=1ll*ans*i%mod*(i*2-2)%mod;
    printf("%d\n",ans);
}

上一题