T1 [HAOI2016]放棋子
https://daniu.luogu.org/problem/show?pid=3182
障碍交换行不影响
所以第i列有障碍的行换到第i行
然后错排公式
本校自测要写压位高精,不写了。。。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct node { int len; int num[401]; void clear() { len=0; memset(num,0,sizeof(num)); } void operator = (int a) { len=0; while(a) len++,num[len]=a%10,a/=10; } void operator = (node a) { len=a.len; for(int i=1;i<=len;i++) num[i]=a.num[i]; } node operator + (node a) { node c; c.clear(); memset(c.num,0,sizeof(c.num)); int L=max(a.len,len); c.len=L; for(int i=1;i<=L;i++) c.num[i]=num[i]+a.num[i]; for(int i=1;i<=L;i++) if(c.num[i]>9) c.num[i+1]+=c.num[i]/10,c.num[i]%=10; if(c.num[L+1]) c.len++; while(c.num[c.len]>9) c.num[c.len+1]=c.num[c.len]/10,c.num[c.len]%=10,len++; if(c.num[c.len+1]) c.len++; return c; } node operator * (int a) { node c; c.clear(); int L; c.len=L=len; for(int i=1;i<=L;i++) c.num[i]=num[i]*a; for(int i=1;i<=L;i++) if(c.num[i]>9) c.num[i+1]+=c.num[i]/10,c.num[i]%=10; if(c.num[L+1]) c.len++; while(c.num[c.len]>9) c.num[c.len+1]=c.num[c.len]/10,c.num[c.len]%=10,len++; if(c.num[c.len+1]) c.len++; return c; } void print() { for(int i=len;i;i--) printf("%d",num[i]); } }; node f[201]; int main() { // freopen("firstmeet.in","r",stdin); // freopen("firstmeet.out","w",stdout); int n; scanf("%d",&n); f[1]=0,f[2]=1,f[3]=2; for(int i=4;i<=n;i++) { f[i].clear(); f[i]=(f[i-1]+f[i-2])*(i-1); } f[n].print(); }