description
某城市的街道呈網格狀,左下角座標為a(0, 0),右上角座標為b(n, m),其中n >= m。現在從a(0, 0)點出發,只能沿著街道向正右方或者正上方行走,且不能經過圖示中直線左上方的點,即任何途徑的點(x, y)都要滿足x >= y,請問在這些前提下,到達b(n, m)有多少種走法。
輸入檔案中僅有一行,包含兩個整數n和m,表示城市街區的規模。
output
輸出檔案中僅有乙個整數和乙個換行/回車符,表示不同的方案總數。
sample input
輸入1:
6 6輸入2:
5 3sample output
輸出1:
輸出2:
data constraint
50%的資料中,n = m,在另外的50%資料中,有30%的資料:1 <= m < n <= 100
100%的資料中,1 <= m <= n <= 5 000
這道題類似我以前做的題 ~~可惜的是我忘了~~qaq
好吧,其實這道題就是說在不超過x<=y這條直線上的,只能向上向右走,從(1,1),走到(n,m)的方案是多少?
其實這道題可以看成乙個楊輝三角(不要問我為什麼,暴力一下便知道,自己腦補。。。)所以我們可以考慮組合數。
那麼我們可以沿題目給的那條線,將終點對稱過去,找到乙個對稱點
我們可以發現從起點到對稱點的路徑再對稱回來的路徑是一條不合法的路徑,
所以ans=無限制亂走方案數-起點走到對稱點的方案數。
其實就是所有的方案數-不合法的方案數即為合法方案數。
所以這裡有公式給參考cm
n+m−
cm−1
n+m
化簡可變成(n
+1−m
)(m+
n)!m
!(n+
1)!
由於答案可能過大,且題目沒有要求取模,所以要上高精度
這裡介紹乙個快速的方法(個人認為是挺快的,起碼比普通高精度快,比壓位好打)
考慮到化簡後是個除法,所以可以求出分子的約數,與分母的約數,
千萬不要先乘,這樣會炸。我們可以把它變成因子連乘的形式,
如3!=1*2*3,這樣分子求出約數後,在求出分母約數,最後約分(具體怎麼做可以看下面我的程式,或自己腦補),因為答案保證它一定是整數,就可以保證正確率了。
最後只要做一遍剩下因子的高精乘就好了。
不用打除法是否棒棒的 o((>ω< ))o
code
#include
#include
#include
#include
#include
#define fo(i,a,b) for (int i=a;i<=b;i++)
#define fd(i,a,b) for (int i=a;i>=b;i--)
#define n 100005
using
namespace
std;
int a[n],b[n],l=1;
int n,m;
void fact(int k)
while (x>0)
}void ys(int x,int k)
}int main()
GDOI2014模擬 雨天的尾巴
給出乙個n個節點的樹和m次操作,每次操作把x到y的路徑上的所有的點的z種物品 1.求最後每個點最多的物品編號。若有多個相同的取編號小的,若沒有則輸出0.n,m 10 5,z 10 9 include include include include include define fo i,a,b fo...
GDOI2014模擬 伺服器
我們可以從n個數中選擇一些,選擇第i個數的代價為ci,且必須選擇n。對於每個沒有被選擇的數i,若它右邊離它最近的乙個被選擇的數是j,則代價為j i。求最小代價。n 10 6 n 2dp還是很顯然的。設fi表示i必須選,且i的右邊已經搞定了的最小代價,那麼fi min fk k i 1 k i 2 c...
GDOI2014模擬 伺服器
直到比賽最後幾分鐘,才發現60 資料居然是乙個水dp,結果沒打完。我們需要將乙個檔案複製到n個伺服器上,這些伺服器的編號為s1,s2,sn。首先,我們可以選擇一些伺服器,直接把檔案複製到它們中 將檔案複製到伺服器si上,需要花費ci 0的置放費用。對於沒有直接被複製檔案的伺服器si來說,它依次向後檢...