原题解链接:https://ac.nowcoder.com/discuss/151505
显然n=1且nmod4=0时答案为0, n=1答案为1。
下面考虑 nmod4=0的情况:
假设 at=t, 取 i=j=t 有 2t=n+1 。
这时n是奇数,矛盾。
若 at=n+1−t, 取 i=n+1−t,j=t, 同样矛盾。
假设 at=u(u=t,u=n+1−t) 。
取 i=u,j=t ,得 au=n+1−t 。
取 i=n+1−t,j=u,an+1−t=n+1−u 。
取 i=n+1−u,j=n+1−t, 得 an+1−u=t 。
由于u=t,u=n+1−t,观察上述等式发现等号右边的四个数两两不同。
进而将此4个数分成形如(u,n+1−V)的两组。可找到这样的四元数组其在排列的相同位置是相同的四个数,但顺序不同。
因此可以通过如下步骤得到全部排列:
1.取最小的整数K,使得ak待定,进而求出au,an+1−u,an+1−k。
2.重复上述过程。
显然答案=2×6×10...×(n−2)。
所以答案等价于4n!!2n!
#include<bits/stdc++.h>
#define Mod 998244353
#define N 2000005
using namespace std;
int n,fac[N];
inline int ksm(int x,int y){
int ans1=1;while (y){
if (y&1) ans1=1ll*ans1*x%Mod;
y>>=1;x=1ll*x*x%Mod;
}return ans1;
}
int main(){
scanf("%d",&n);fac[0]=1;
if (n==1) return puts("1"),0;
if (n&3) return puts("0"),0;
for (int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%Mod;
printf("%lld\n",1ll*fac[n/2]*ksm(fac[n/4],Mod-2)%Mod);
return 0;
}