n * n的方格,從左上到右下畫一條線。乙個機械人從左上走到右下,只能向右或向下走。並要求只能在這條線的上面或下面走,不能穿越這條線,有多少種不同的走法?由於方法數量可能很大,只需要輸出mod 10007的結果。
input
輸入乙個數n(2 <= n <= 10^9)。
output
輸出走法的數量 mod 10007。
sample input
4sample output
10卡特蘭數+盧卡斯+費馬小定理:
分析:列舉幾個n就會發現,結果就是卡特蘭數乘2
卡特蘭數:
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, …
這裡用到求卡特蘭數的乙個公式:h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,…)
然後其實這就是乙個比較裸的卡特蘭+盧卡斯模板。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define n 205
#define inf 0x3f3f3f3f
using
namespace std;
typedef
long
long ll;
const
int maxn =
1e6+5;
int p=
1e4+7;
//快速冪
ll quick_pow
(ll n,ll m)
return ans;
}//求組合數c(n,m)
ll c
(ll n,ll m)
return ans;
}//盧卡斯模板
ll lucas
(ll n,ll m)
intmain()
51nod 1120 機械人走方格V3
1120 機械人走方格 v3 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 n n的方格,從左上到右下畫一條線。乙個機械人從左上走到右下,只能向右或向下走。並要求只能在這條線的上面或下面走,不能穿越這條線,有多少種不同的走法?由於方法數量可能很大,只需要輸出mo...
51nod1120 機械人走方格 V3
跟括號序列是一樣的,將向右走看成是左括號向左走看成是右括號就可以了。那麼就是卡特蘭數了。然後由於n和m太大所以用了lucas定理 跟括號序列是一樣的,將向右走看成是左括號向左走看成是右括號就可以了。那麼就是卡特蘭數了。include include include includeusing name...
51Nod1120 機械人走方格 V3
題目看這裡 乙個數學題,答案就是卡特蘭數 2 求卡特蘭數要用到組合數求法f n c 2n 2,n 1 n 由於模數較小,可以lucas定理直接做,但是這樣是有問題的因為n不一定和模數互質,但是還是a了,資料比較水 pragma gcc opitmize o3 pragma g opitmize o3...