第十届蓝桥杯国赛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]);
    }
}

 

   

posted @ 2021-01-22 22:03  键盘_书生  阅读(429)  评论(0编辑  收藏  举报