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 }
机器人走方格 V3
时间: 2024-10-17 18:21:03