首先看题
有思维的解法也有打表的解法,我们首先看思维的解法
这道题看了大佬的思维解法有感而发:
首先给定一个数字n
我们首先不去管这个n
假设有n-2个数(2—n-1)和4个盒子
那么我们将他们全排列,也就是!(n+2);
那么这四个盒子有什么用呢,假设n=5
那么我们随便写一下
如果我们将4个盒子彼此不相同看待的话,那么将他们全排列也就是!(n+2)全排列;
我们将最外层的两个盒子,也就是2右边的和4右边的盒子一个设置为l,一个设置为r
即l--r之间就是我们要找的子区间,,全排列的同时区间也全排列了
但是盒子毕竟是盒子,盒子之间是相同的,所以要除!4也就是24
最里面的数字要放1和n
所以最里面两个盒子只有两种可能,也就是1, 5或者5, 1,所以要再乘以2;
故公式为!(n+2)/12;
代码在下边
#include<stdio.h>
#include<iostream>
#include<queue>
#include<stack>
#include<math.h>
#include<string.h>
#include<map>
#include<algorithm>
#define MAX 0x3f
#define int long long
#define clean(a,x) memset(a,x,sizeof(a))//万年不变头文件
using namespace std;
const int maxn=1e6+10;
int number[maxn];
int yu = 998244353;
signed main(){
int n;
scanf("%lld", &n);
if(n == 1){
printf("1");
return 0;
}
int sum = 1;
for(int i=1;i<=n+2;i++){
sum= ( sum*i )%yu;
if(i == 4){
sum /= 12;
}
}
printf("%lld", sum);
}
还有一种方式是打表的解法
打表的解法比较暴力
我们可以看前四个
1 1
2 2
3 10
4 60
递推出来后公式为a[i] = a[i-1] * (i+2) ,i>2
在n == 1的时候需要特判
代码比较简单,就不写了