纪念一下,手打暴力+oeis搜,AC
查看原帖
纪念一下,手打暴力+oeis搜,AC
89644
Harry_hcx楼主2021/11/17 15:13

先算X=2P(n+1n+1)n(n1)X= \frac{2*P\binom{n+1}{n+1}}{n*(n-1)}
再求XX的逆元,命名为Fer=Xp2Fer= X^{p-2}
KK++
再求k(k1)(k2)(k3)...(kn)k*(k-1)*(k-2)*(k-3)...(k-n)
最后把求出来的乘上FerFer即可
全程使用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;
}
2021/11/17 15:13
加载中...