poj 3088
第一类斯特灵数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; }