【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.
null
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步