1515 跳 - Wikioi
題目描述 Description
邪教喜歡在各種各樣空間內跳。
現在,邪教來到了一個二維平面。在這個平面內,如果邪教當前跳到了(x,y),那么他下一步可以選擇跳到以下4個點:(x-1,y), (x+1,y), (x,y-1), (x,y+1)。
而每當邪教到達一個點,他需要耗費一些體力,假設到達(x,y)需要耗費的體力用C(x,y)表示。
對于C(x,y),有以下幾個性質:
1、若x=0或者y=0,則C(x,y)=1。
2、若x>0且y>0,則C(x,y)=C(x,y-1)+C(x-1,y)。
3、若x<0且y<0,則C(x,y)=無窮大。
現在,邪教想知道從(0,0)出發到(N,M),最少花費多少體力(到達(0,0)點花費的體力也需要被算入)。
由于答案可能很大,只需要輸出答案對10^9+7取模的結果。
輸入描述 Input Description
讀入兩個整數N,M,表示邪教想到達的點。
輸出描述 Output Description
輸出僅一個整數,表示邪教需要花費的最小體力對10^9+7取模的結果。
樣例輸入 Sample Input
1 2
樣例輸出 Sample Output
6
數據范圍及提示 Data Size & Hint
對于10%的數據,滿足N, M<=20;
對于30%的數據,滿足N, M<=100;
對于60%的數據,滿足min(N,M)<=100;
對于100%的數據,滿足0<=N, M<=10^12,N*M<=10^12。
?
?
首先我們可以發現,格子上的值就是組合數,然后稍微想一下就可以貪心(打表也可以啊)
一直往小的那邊走,然后就得到一個min(n,m)*log(10^9+7),log是求乘法逆元,用費馬小定理求逆元,這樣理論復雜度是可以過的,但是p黨沒人權還要優化一點
其實貪心的路徑很好算,有一條都是1,另一條加起來其實就是C(n+m+1,min(n,m))(我是下別人的代碼才知道的)
所以答案就是max(n,m)+C(n+m+1,min(n,m))
1 const 2 h=1000000007; 3 var 4 n,m,ans,s:int64; 5 6 procedure swap(var x,y:int64); 7 var 8 t:int64; 9 begin 10 t:=x;x:=y;y:=t; 11 end; 12 13 function mexp(a,b:int64):int64; 14 begin 15 if b=0 then exit(1); 16 mexp:=sqr(mexp(a,b>>1))mod h; 17 if b and 1=1 then mexp:=mexp*a mod h; 18 end; 19 20 procedure main; 21 var 22 i:longint; 23 begin 24 read(n,m); 25 if n>m then swap(n,m); 26 s:=1; 27 for i:=1 to n do 28 s:=s*(((n+m-i+2)mod h)*mexp(i,h-2)mod h)mod h; 29 ans:=m+s; 30 writeln(ans mod h); 31 end; 32 33 begin 34 main; 35 end. View Code?
轉載于:https://www.cnblogs.com/Randolph87/p/3746367.html
總結
以上是生活随笔為你收集整理的1515 跳 - Wikioi的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flex +WebService
- 下一篇: ADT-bundle