太神了,被数学题虐了

orz http://m.blog.csdn.net/blog/skywalkert/43970331

这道题关键是抓住m较小的特点,构造递推解决

 1 const mo=1000000007;
 2 
 3 var c:array[0..1010,0..1010] of longint;
 4     f:array[0..1010] of int64;
 5     i,j,n,m:longint;
 6     t,ch:int64;
 7 
 8 function quick(x:int64;y:longint):int64;
 9   begin
10     quick:=1;
11     while y>0 do
12     begin
13       if y mod 2=1 then quick:=quick*x mod mo;
14       y:=y div 2;
15       x:=x*x mod mo;
16     end;
17   end;
18 
19 begin
20   readln(n,m);
21   c[0,0]:=1;
22   for i:=1 to m do
23   begin
24     c[i,0]:=1;
25     for j:=1 to i do
26       c[i,j]:=(c[i-1,j]+c[i-1,j-1]) mod mo;
27   end;
28   if m=1 then
29     writeln(int64(n)*int64(n+1) div 2 mod mo)
30   else begin
31     ch:=quick(m-1,mo-2);
32     f[0]:=int64(m)*(quick(m,n)-1+mo) mod mo*ch mod mo;
33     for i:=1 to m do
34     begin
35       f[i]:=quick(n,i)*quick(m,n+1) mod mo;
36       for j:=0 to i-1 do
37       begin
38         t:=int64(c[i,j])*f[j] mod mo;
39         if (i-j)  mod 2=1 then f[i]:=(f[i]-t+mo) mod mo
40         else f[i]:=(f[i]+t) mod mo;
41       end;
42       f[i]:=f[i]*ch mod mo
43     end;
44     writeln(f[m]);
45   end;
46 end.
View Code

 

posted on 2015-05-09 17:22  acphile  阅读(208)  评论(0编辑  收藏  举报