【NOIP2017练习】怎样学习哲学(计数,DP)

题意:OI大师抖儿在夺得银牌之后,顺利保送pku。这一天,抖儿问长者:“虽然我已经保送了,但是我还要参加学考。马上就要考政治了,请问应该怎样学习哲学,通过政治考试?”

 长者回答:“你啊,Too Young Too Simple,Sometimes Naive!哲学这种东西,不是说想懂就能懂的,需要静心撕烤。你去后面的森林里好好想想。”
长者的后院有一片哲♂学森林。由于一些奥妙重重的原因,这片森林构成了一个n*m的矩形,其中每个点就代表了一棵树。此外,由于辣鸡出题人KJDH从中捣鬼,有些树被连根拔起(也就是消失了)。抖儿每天都要到树下撕烤,因此他想要在每一行选择一棵树。但是他非常讨厌走回头路,因此第i行选择的树必须比第i-1行的靠右。现在抖儿想知道,总共有多少种选择的方案 mod 1000003。
对于所有的数据,保证n,m≤10^9,p≤min(n*m,2000)
 
思路:出题人lyy系列

 

【后记】
在经历了长久的撕烤之后,抖儿终于领悟了哲♂学奥义。
抖儿对长者说:“我知道了!哲学源于生活,只有撕烤生活,才能领悟哲理。”
长者嘿嘿一笑:“你想多了。因为你在哲♂学之森中待的时间太长,政治学考已经在一个月前结束了。”
复制代码
 1 const mo=1000003;
 2 var x,y:array[1..2100]of longint;
 3     dp:array[1..2100]of int64;
 4     fac,exf:array[0..mo]of int64;
 5     n,m,i,p,j:longint;
 6 
 7 procedure swap(var x,y:longint);
 8 var t:longint;
 9 begin
10  t:=x; x:=y; y:=t;
11 end;
12 
13 procedure qsort(l,r:longint);
14 var i,j,mid1,mid2:longint;
15 begin
16  i:=l; j:=r; mid1:=x[(l+r)>>1]; mid2:=y[(l+r)>>1];
17  repeat
18   while (mid1>x[i])or((mid1=x[i])and(mid2>y[i])) do inc(i);
19   while (mid1<x[j])or((mid1=x[j])and(mid2<y[j])) do dec(j);
20   if i<=j then
21   begin
22    swap(x[i],x[j]);
23    swap(y[i],y[j]);
24    inc(i); dec(j);
25   end;
26  until i>j;
27  if l<j then qsort(l,j);
28  if i<r then qsort(i,r);
29 end;
30 
31 function c(n,m:longint):int64;
32 begin
33  if (n<m)or(m<0) then exit(0);
34  if (n<=mo)and(m<=mo) then exit(fac[n]*exf[m] mod mo*exf[n-m] mod mo);
35  exit(c(n div mo,m div mo)*c(n mod mo,m mod mo) mod mo);
36 end;
37 
38 begin
39  assign(input,'zhexue.in'); reset(input);
40  assign(output,'zhexue.out'); rewrite(output);
41  readln(n,m,p);
42  for i:=1 to p do read(x[i],y[i]);
43  fac[0]:=1; exf[0]:=1; exf[1]:=1;
44  for i:=1 to mo do fac[i]:=fac[i-1]*i mod mo;
45  for i:=2 to mo do exf[i]:=exf[mo mod i]*(mo-mo div i) mod mo;
46  for i:=1 to mo do exf[i]:=exf[i-1]*exf[i] mod mo;
47  inc(p); x[p]:=n+1; y[p]:=m+1;
48  qsort(1,p);
49  for i:=1 to p do
50  begin
51   dp[i]:=c(y[i]-1,x[i]-1);
52   for j:=1 to i-1 do
53    if (x[j]<x[i])and(y[j]<y[i]) then
54     dp[i]:=(dp[i]-dp[j]*c(y[i]-y[j]-1,x[i]-x[j]-1) mod mo) mod mo;
55   dp[i]:=(dp[i] mod mo+mo) mod mo;
56  end;
57  writeln(dp[p]);
58  close(input);
59  close(output);
60 end.
复制代码

 

 

 

 

 

posted on   myx12345  阅读(311)  评论(0编辑  收藏  举报

努力加载评论中...

导航

点击右上角即可分享
微信分享提示