递推+环状特殊处理+高精度
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int n;
int f[105][50],sum[50];
void mul(int* a,int* b,int x)
{
a[0]=max(a[0],b[0]);
for (int i=1;i<=b[0];i++)
a[i]+=x*b[i];
for (int i=1;i<=a[0];i++)
if (a[i]>=10)
{
if (i==a[0])
a[0]++;
a[i+1]+=a[i]/10;
a[i]%=10;
}
}
int main()
{
scanf("%d",&n);
f[0][0]=f[0][1]=1;
for (int i=1;i<n;i++)
for (int j=1;j<=i;j++)
mul(f[i],f[i-j],j);
for (int i=1;i<=n;i++)
mul(sum,f[n-i],i*i);
for (int i=sum[0];i>=1;i--)
printf("%d",sum[i]);
return 0;
}
另外有一种方法
记f[n]为n轮状的答案
观察下列式子
f[1]=1=1*1
f[2]=5=5*1*1
f[3]=16=4*4
f[4]=45=5*3*3
f[5]=121=11*11
f[6]=320=5*8*8
可以发现,n为奇数时,f[n]=F[n]*F[n]。
n为偶数时,f[n]=5*F[n]*F[n]。
其中F[n]=F[n-1]*3-F[n-2],F[1]=1,F[2]=4.
再加上高精度