joj 2443

 

 

/* f(n,m)为前N个数字逆序数为M的种类数 当m-n-1>=0时(n-1可以找到以m为逆序数的排列,当然f[n-1][m]=0) f(n,m)=f(n-1,m)+f(n-1,m-1)+f(n-1,m-2)+....+f(n-1,m-n+1); f(n,m-1)=f(n-1,m-1)+f(n-1,m-2)+....+f(n-1,m-n-1)+f(n-1,m-n) f(n,m)=f(n-1,m)+f(n,m-1)-f(n-1,m-n) f(0,0)=0; 1 2 3 0 1 3 2 1 2 3 1 2 2 1 3 1 3 1 2 2 3 2 1 3 */ #include<cstdio> const int mod=1000000007; int f[1001][10001]; int main() { int i,j; f[0][0]=1; int t=0; for(i=1;i<=1000;++i) { t=t+(i-1); if(t>10000) t=10000; for(j=0;j<=t;++j) { if(j==0) f[i][j]=f[i-1][j] % mod; else { f[i][j]=( (f[i-1][j] + f[i][j-1] ) % mod +mod) % mod; if(j-i>=0) f[i][j]=( (f[i][j]-f[i-1][j-i]) % mod +mod) % mod; } } } int n,c; while(scanf("%d%d",&n,&c)!=EOF) { printf("%d/n",f[n][c]); } return 0; }  

你可能感兴趣的:(c)