题解 P3182 【[HAOI2016]放棋子】
如果知道了错排问题,那这就是一个裸的高精。
原博客戳这里 YoungNeal
Description
给你一个
Solution
我们先来科普一下错排问题。
错排问题指考虑一个有
看上去这就是一个递推问题,那么递推式是如何推出来呢?
当
第一步,把第
第二步,放编号为
综上得到
特殊地,
知道了这个之后,这题就是一个裸的高精了。
// By YoungNeal
#include<cstdio>
using namespace std;
// D(n)=(n-1)*(D(n-1)+D(n-2))
// D(1)=0 D(2)=1
int n;
int D[205][100005];
void ad(int now){
int x=0;
for(int i=1;i<100005;i++){
D[now][i]=D[now-1][i]+D[now-2][i]+x;
x=D[now][i]/10;
D[now][i]%=10;
}
x=0;
for(int i=1;i<100005;i++){
D[now][i]=D[now][i]*(now-1)+x;
x=D[now][i]/10;
D[now][i]%=10;
}
}
signed main(){
scanf("%d",&n);
D[2][1]=1;
if(n==1||n==2){
printf("%d",n-1);
return 0;
}
for(int i=3;i<=n;i++)
ad(i);
int lenc=100004;
while(D[n][lenc]==0) lenc--;
while(lenc) printf("%d",D[n][lenc--]);
return 0;
}