首页 > 代码库 > 机器人走方格 V3

机器人走方格 V3

1120 . 机器人走方格 V3
 
基准时间限制:1 秒 空间限制:65536 KB 分值: 160
N * N的方格,从左上到右下画一条线。一个机器人从左上走到右下,只能向右或向下走。并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10007的结果。
 
Input
输入一个数N(2 <= N <= 10^9)。
Output
输出走法的数量 Mod 10007。
Input 示例
4
Output 示例
10

思路:实际是本质就是,n个0,n个1,序列中1的个数小于等于0.
和string是同一类型题。c(n+m,n)-c(n+m,n-1);
这题需要*2;
由于mod = 10007;
 1 /**C(n+m,n)-C(n+m,n-1)**/
 2 #include<iostream>
 3 #include<stdio.h>
 4 #include<cstring>
 5 #include<cstdlib>
 6 using namespace std;
 7 typedef __int64 LL;
 8 
 9 const LL p = 10007;
10 LL dp[10008];
11 void init()
12 {
13     int i;
14     dp[0]=1;
15     for(i=1;i<=10007;i++)
16         dp[i]=(dp[i-1]*i)%p;
17 }
18 LL pow_mod(LL a,LL n)
19 {
20     LL ans=1;
21     a=a%p;
22     while(n)
23     {
24         if(n&1) ans=(ans*a)%p;
25         n=n>>1;
26         a=(a*a)%p;
27     }
28     return ans;
29 }
30 LL C(LL n,LL m)
31 {
32     if(n<m)return 0;
33     if(m>n-m) m=n-m;
34     LL sum1=dp[n];
35     LL sum2=(dp[m]*dp[n-m])%p;
36     sum1 = (sum1*pow_mod(sum2,p-2))%p;
37     return sum1;
38 }
39 LL Lucas(LL n,LL m)
40 {
41     LL ans=1;
42     while(n&&m&&ans)
43     {
44         ans=(ans*C(n%p,m%p))%p;
45         n=n/p;
46         m=m/p;
47     }
48     return ans;
49 }
50 int main()
51 {
52     init();
53     LL n;
54     while(scanf("%I64d",&n)>0)
55     {
56         n=n-1;
57         LL ans=Lucas(n+n,n);
58         LL cur=Lucas(n+n,n-1);
59         ans=ans-cur;
60         if(ans<0) ans=ans+p;
61         ans=(ans*2)%p;
62         printf("%I64d\n",ans);
63     }
64     return 0;
65 }