BZOJ 4563 错排+高精度
思路:
把障碍移到对角线
就发现 这是个错位排列问题
用错排公式即可解
s[i]=(s[i-1]+s[i-2])*i
//By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct Bignum{ int a[1024],num; void init(){memset(a,0,sizeof(a));num=0;} friend Bignum operator+(Bignum a,Bignum b){ Bignum c;c.init(); for(int i=1;i<=max(a.num,b.num);i++) c.a[i]=a.a[i]+b.a[i]; for(int i=1;i<=a.num+b.num;i++){ c.a[i+1]+=c.a[i]/10,c.a[i]%=10; if(c.a[i])c.num=i; }return c; } friend Bignum operator*(Bignum a,Bignum b){ Bignum c;c.init(); for(int i=1;i<=a.num;i++) for(int j=1;j<=b.num;j++) c.a[i+j-1]+=a.a[i]*b.a[j]; for(int i=1;i<=a.num+b.num;i++){ c.a[i+1]+=c.a[i]/10,c.a[i]%=10; if(c.a[i])c.num=i; }return c; } }f[222],g; int main(){ int n; f[2].a[1]=f[2].num=g.num=1,g.a[1]=1; for(int i=3;i<=200;i++)g=g+f[2],f[i]=(f[i-1]+f[i-2])*g; scanf("%d",&n); for(int j=f[n].num;j;j--)printf("%d",f[n].a[j]); }