列表

详情


NC229275. Count the Arrays

描述

你的任务是计算数组的数量,使得:

每个数组包含 个元素;
每个元素都是的整数;
对于每个数组,恰好有一对相等的元素;
对于每个数组,都存在一个索引,使得该数组在第 个元素之前严格升序并在它之后严格降序(形式上,这意味着,如果,并且,如果)。

输入描述

第一行包含两个整数

输出描述

输出一个整数,表示满足上述所有条件的数组的数量,取模

示例1

输入:

3 4

输出:

6

说明:

6种序列是:

示例2

输入:

3 5

输出:

10

示例3

输入:

42 1337

输出:

806066790

示例4

输入:

100000 200000

输出:

707899035

原站题解

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

C++ 解法, 执行用时: 202ms, 内存消耗: 420K, 提交时间: 2022-02-09 15:17:58

#include<bits/stdc++.h>
using namespace std;
int n, m, mo=998244353;
long long s=1, ans;
long long ksm(long long a, int b){
	long long s=1;
	while(b){
		if(b&1) s=s*a%mo;
		a=a*a%mo, b>>=1;
	}
	return s;
}
int main(){
	scanf("%d%d", &n, &m);
	for(int i=1; i<=n-2; i++){
		s=s*(n-1-i)%mo;
		ans+=s;
		s=s*ksm(i, mo-2)%mo;
	}
	s=1, ans%=mo;
	for(int i=1; i<n; i++){
		s=s*(m-i+1)%mo*ksm(i, mo-2)%mo;
	}
	printf("%lld", ans*s%mo);
	return 0;
}

pypy3 解法, 执行用时: 279ms, 内存消耗: 26232K, 提交时间: 2021-10-29 01:13:11

mod = 998244353

def C(n,m):
    ans=1
    for i in range(1,m+1):
        ans=ans*(n-m+i)%mod
        ans=ans*pow(i,mod-2,mod)
    return ans

n,m = map(int,input().split())
if n==2:
    print(0)
else:
    ans = C(m,n-1)*(n-2)%mod*pow(2,n-3,mod)%mod
    print(ans)

上一题