标签:style class blog c code java
输入一个数N(2 <= N <= 10^9)。
输出走法的数量 Mod 10007。
4
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 }
标签:style class blog c code java
原文地址:http://www.cnblogs.com/tom987690183/p/3749321.html