题目链接:https://vjudge.net/problem/HDU-6432
题目思路:很容易就想到了容斥原理,可惜并不怎么会,然后看了一会队友给我博客,有点懂了,然后就是由于是圆排列,把1放在最前面,然后剩余的n-1个位置,分别容斥至少有k个顺序对C(n,k)*(n-k-1)!
结果便是(-1)^n+sigma((-1)^k*C(n,k)*(n-k-1)!) (k from 0 to n-1)
看着这并不复杂的式子,我选择oeis,
num[i]=((((i-2)*num[i-1])%mod+(i-1)*num[i-2])%mod-((i&1==1)?-1:1))%mod;
AC代码
#include<bits/stdc++.h>
using namespace std;
#define mod 998244353
long long num[100007];
int main()
{
int t;
scanf("%d",&t);
num[0]=num[1]=num[2]=0;
num[3]=1;
num[4]=1;
num[5]=8;
for(int i=6;i<=100000;++i)
num[i]=((((i-2)*num[i-1])%mod+(i-1)*num[i-2])%mod-((i&1==1)?-1:1))%mod;
while(t--)
{
int n;
scanf("%d",&n);
cout<<num[n]<<endl;
}
return 0;
}