第十届蓝桥杯国赛C++B组 排列数

排列数

在一个排列中,一个折点是指排列中的一个元素,它同时小于两边的元素,或者同时大于两边的元素。

对于一个 1∼n 的排列,如果可以将这个排列中包含 t 个折点,则它称为一个 t+1 单调序列。

例如,排列 (1,4,2,3) 是一个 3 单调序列,其中 4 和 2 都是折点。

给定 n 和 k,请问 1∼n 的所有排列中有多少个 k 单调队列?

输入格式

输入一行包含两个整数 n,k。

输出格式

输出一个整数,表示答案。

答案可能很大,你可需要输出满足条件的排列数量除以 123456 的余数即可。

数据范围

1≤k≤n≤500

输入样例:

4  2

输出样例:

 12




思路参考自抽风巨巨的证明---> 链接
import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        int mod = 123456;
        int[][] dp = new int[550][550];
        dp[1][1] = 1;
        dp[2][1] = 2;
        for(int i=3;i<=n;i++) for(int j=1;j<=k&&j<=i;j++)
            if(j>=2) dp[i][j] = (dp[i-1][j] *j%mod +dp[i-1][j-1]*2%mod+dp[i-1][j-2]*(i-j)%mod)%mod;
            else dp[i][j] = (dp[i-1][j] *j%mod +dp[i-1][j-1]*2%mod)%mod;
        System.out.println(dp[n][k]);
    }
}

   

原文地址:https://www.cnblogs.com/fxzemmm/p/14315661.html