题意:
找到n个数的循环排列组合之中不会出现[ i , i+1 % n ]的情况
例如第一个样例n=4的时候
不能出现1 - 2 , 2 - 3 , 3 - 4 , 4 - 1这几种情况
1 3 2 4像这种是错误的,因为可以循环排列,实际上是1 3 2 4 1 3 2 4 ......其中包含了4 - 1,所以是不行的
所以也就只有这么一种,1 4 3 2
这时候就有人问了,诶那么3 2 1 4好像是也可是的啊,是,没错,也是可以,但是这两个在循环排列里面完完全全是同一个东西。。。
思路:这道题推来推去推不出来公式,oeis一下居然还真有
于是公式就出来了
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100010
#define mod 998244353
long long a[MAXN];
void init()
{
a[1]=a[1]=0;
a[3]=1;
for(int i=4;i<=100005;i++){
a[i]=((i-3)*a[i-1]%mod+((i-2)*((2*a[i-2]%mod+a[i-3])%mod)%mod))%mod;
}
}
int main()
{
init();
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
printf("%lld\n",a[n]);
}
}