先算X=n∗(n−1)2∗P(n+1n+1)
再求X的逆元,命名为Fer=Xp−2
K++
再求k∗(k−1)∗(k−2)∗(k−3)...(k−n)
最后把求出来的乘上Fer即可
全程使用oeis找规律,具体为什么我完全不知道,等待题解ing...
暴力代码在这
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int N=202;
int n,a[N],k,f[N][N],s[N],ans;
int getans(){
memset(f,0x3f,sizeof(f));
s[0]=0;
for (int i=1;i<=n;i++)
s[i]=s[i-1]+a[i];
// cout<<endl;
for (int i=1;i<=n;i++)
f[i][i]=0;
for (int k=2;k<=n;k++)
for (int i=1;i+k-1<=n;i++){
int j=i+k-1;
for (int h=i+1;h<=j;h++)
f[i][j]=min(f[i][h-1]+f[h][j]+(s[h-1]-s[i-1])*(s[j]-s[h-1]),f[i][j]);
}
int ans=INT_MAX;
for (int i=1;i<=1;i++)
ans=min(f[i][i+n-1],ans);
// cout<<ans<<endl;
return ans;
}
void search(int idx,int val){
if (idx>n||val<=0) return;
for (int i=1;i<=val-n+idx;i++){
a[idx]=i;
if (idx==n&&val==i) ans+=getans();
else if (idx!=n) search(idx+1,val-i);
}
}
int main(){
while(cin>>n){
for (int k=1;k<=14;k++){
ans=0;
search(1,k);
cout<<ans<<',';
}
cout<<endl;
}
return 0;
}