第一类斯特灵数S(n,m)就是把n元集合分成m部的个数,有递推关系S(n,m)=S(n-1,m-1)+mS(n-1,m).
所求还要全排列一下.再 乘以m!就可以了累加1~B个数全部用上,就是结果.
F(B)=sum(C(B,i)*(Sum(Stir( i,j )* j ! ) ) )就是结果.
代码:
#include<iostream>
#include<fstream>
#include<cmath>
using namespace std;
long long dp[13][13];
long long ans[13];
long long fun(long long s){
if(s==1) return 1;
else
return fun(s-1)*s;
}
long long ok(long long s,long long t){
long long i,j,k=1;
for(i=1;i<=t;i++)
k=k*(s-t+i)/i;
return k;
}
void read(){
// ifstream cin("in.txt");
long long i,j,k;
for(i=1;i<=12;i++){
dp[i][1]=1;
for(j=2;j<i;j++)
dp[i][j]=dp[i-1][j-1]+j*dp[i-1][j];
dp[i][i]=1;
}
for(i=1;i<=12;i++)
for(j=1;j<=i;j++)
{
long long s=0;
for(k=1;k<=j;k++)
{
s+=dp[j][k]*fun(k);
}
ans[i]+=s*ok(i,j);
}
cin>>k;
for(i=1;i<=k;i++)
{
cin>>j;
printf("%lld %lld %lld\n",i,j,ans[j]);
}
}
int main(){
read();
return 0;
}