雨へ痕
下一站路口,未知的道路

这题目,一直都看不懂,那是什么英语表达呀,极度无奈!!后来没题做才回头再读这题,最后读懂的时候发现有striling数(第二类)!

上年的网赛也有这玩意,那时候不是我做的,那之后研究了一番,但一直没遇到题目,终于它有机会重见天日!

不过另外一部分是要从n个东西里面取出r个,每个间距>k,一开始没往dp想,但一发现是dp就很简单了,做个求和数组,就是n^2的dp啦。

 1 //http://cnc.boj.me/onlinejudge/newoj/showProblem/show_problem.php?problem_id=216
2 #include <stdio.h>
3 int N=1000000007;
4 int dp[1005][1005];
5 #define M 1002
6 long long str2[M][M];
7 void stirling1()
8 {
9 int i,j;
10 for(i=0;i<M;i++) {str2[i][0]=0;str2[i][i]=1;}
11 for(i=1;i<M;i++)
12 {
13 for(j=1;j<i;j++)
14 {
15 str2[i][j]=(str2[i-1][j-1]+j*str2[i-1][j])%N;
16 }
17 }
18 for(i=1;i<M;i++)
19 {
20 for(j=2;j<=i;j++)
21 {
22 str2[i][j]+=str2[i][j-1];
23 str2[i][j]%=N;
24 }
25 }
26 }
27
28 int main()
29 {
30 int n,i,j,k,t,m;
31 int r;
32 stirling1();
33 while(scanf("%d%d%d%d",&n,&r,&k,&m)!=EOF)
34 {
35 if(m>r) m=r;
36 if((r-1)*k+1>n) {puts("0");continue;}
37 for(i=1;i<=n;i++)
38 {
39 dp[1][i]=i;
40 }
41 for(i=2;i<=r;i++)
42 {
43 for(j=0;j<(i-1)*k+1;j++) dp[i][j]=0;
44 for(j=(i-1)*k+1;j<=n;j++)
45 {
46 dp[i][j]=dp[i-1][j-k]%N;
47 }
48 for(j=1;j<=n;j++)
49 {
50 dp[i][j]+=dp[i][j-1];
51 dp[i][j]%=N;
52 }
53 }
54 printf("%lld\n",(str2[r][m]%N)*(dp[r][n]%N)%N);
55
56 }
57 return 0;
58 }

posted on 2011-10-17 20:35  雨^痕  阅读(147)  评论(0)    收藏  举报