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