这道题是用错排的性质来做,比如: 十本不同的书放在书架上。现重新摆放,使每本书都不在原来放的位置。有几种摆法?这个问题推广一下,就是错排问题。
递推公式: D(n) = (n-1) [D(n-2) + D(n-1)]
特殊地,D(1) = 0, D(2) = 1.
D(n) = n! (1/0! - 1/1! + 1/2! - 1/3! - ..... + (-1)^n/n!),当n很大时计算就很不方便。一个供参考的简化后的公式是D(n) = [n!/e+0.5] ,其中e是自然对数的底,[x]为x的整数部分。
证明百度上有,就不写了。
直接上代码了

#include<cstdio>
#include<cstdlib>
#include<iostream>
#define ll long long
const ll mod = 998244353;
using namespace std;
int main()
{
   ios::sync_with_stdio(0),cin.tie(nullptr),cout.tie(nullptr);
   ll d=0,d1,d2;
   d1 = 0; d2 =1;
   ll n;
   cin>>n;
   for(int i=3; i<=n; i++)
   {
       d = (i-1)*(d1+d2)%mod;
       d1 = d2;
       d2 = d;
   }
    if(n==1)
        cout<<d;
    else if(n==2)
        cout<<d2;
    else
        cout<<d;

    return 0;
}