• CodeForces


    D -Count the Arrays

    Your task is to calculate the number of arrays such that:

    each array contains n elements;
    each element is an integer from 1 to m;
    for each array, there is exactly one pair of equal elements;
    for each array a, there exists an index i such that the array is strictly ascending before the i-th element and strictly descending after it (formally, it means that aj<aj+1, if j<i, and aj>aj+1, if j≥i).
    Input
    The first line contains two integers n and m (2≤n≤m≤2⋅105).

    Output
    Print one integer — the number of arrays that meet all of the aforementioned conditions, taken modulo 998244353.

    Examples
    Input

    3 4
    Output
    6
    Input
    3 5
    Output
    10
    Input
    42 1337
    Output
    806066790
    Input
    100000 200000
    Output
    707899035
    Note
    The arrays in the first example are:

    [1,2,1];
    [1,3,1];
    [1,4,1];
    [2,3,2];
    [2,4,2];
    [3,4,3].

    题意:
    给定n,m,让你构造一个长度为n的数组,要求这n个数都必须在1~m范围内,且要有两个数相同,数组内的值是先上升再下降的形式,问能够构造的组数。
    思路:
    昨晚做完C就到时间了,今早一看其实挺好想的。
    很容易想到我们选择一个最大值放在倒数第二位,因为要保证了先上升再下降的形式,所以最大值必然只有一个。
    我们可以先从m个数里选择n-1个数,这其中包括最大值。再从剩下的n-2个数里选择一个放在最后一位。
    再来考虑一下这一组数内部的顺序问题,最大值的位置是不会变的,两个相等的数位置变了也没有影响,剩下的n-3个数,有最大值左边和最大值右边两种情况,所以是2^(n-3)。
    被内部的顺序问题卡住了qwq
    组合数学模板:传送门

    代码:
    要注意特判n==2的情况,不然用lucas会t

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll m,n,p=998244353;
    ll ksm(ll a,ll b,ll p){
    	ll res=1;
    	while(b){
    //&运算当相应位上的数都是1时,该位取1,否则该为0。
    		if(b&1)
    			res=1ll*res*a%p;//转换为ll型
    		a=1ll*a*a%p;
    		b>>=1;//十进制下每除10整数位就退一位 
    	}
    	return res;
    }
    ll c(ll a,ll b,ll p){
    	if(b>a) return 0;
    	ll res=1; 
    	for(int i=1,j=a;i<=b;i++,j--){
    		res=res*j%p;
    		res=res*ksm(i,p-2,p)%p;//逆元 
    	}
    	return res; 
    }
    ll lucas(ll a,ll b,ll p){
    	if(a<p &&b<p) return c(a,b,p);
    	return c(a%p,b%p,p)*lucas(a/p,b/p,p)%p;
    }
    int main(){
        cin>>n>>m;
        if(n==2){
            puts("0");
            return 0;
        }
        ll res=lucas(m,n-1,p)%p*ksm(2,n-3,p)%p*(n-2)%p;
        cout<<res;
    	return 0;
    }
    
    
  • 相关阅读:
    oracle 中有数据但是sql查询不出来结果(中文)
    linux mac 命令行 远程连接ssh提示IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY解决
    各地图坐标系知识及其转换方法
    Arcgis更新sde库许可
    运营商的三大数据域——B域,O域,M域
    SQL语句大全,所有的SQL都在这里
    苹果手机开启热点后,电脑搜索不到
    ArcgisServer在Linux系统上更新许可
    Linux 查询文件内容重复数 uniq、sort命令
    Atom 配置 Python
  • 原文地址:https://www.cnblogs.com/OvOq/p/14853184.html
Copyright © 2020-2023  润新知