码迷,mamicode.com
首页 > 其他好文 > 详细

codevs 1515 跳

时间:2016-05-24 22:38:04      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:

/*
画矩阵找规律发现是杨辉三角 Cg (i,j)= C (i+j,i);
贪心走的话 沿着0行(列)一直走然后拐直角
拐弯后每个格子都累加 
Cg (n,0) + Cg (n,1) + Cg (n,2) + ... +Cg (n,m)  有n>m
即  C(n+0,n) + C (n+1,n) + C (n+2,n) + ... +C (n+m,n) 
上式 = C (n+m+1,m);
然后 ans = n + C (n+m+1,m);
考虑到n m很大 用Lucas定理 
之前敲得Lcs都是用数组存阶乘 哪里的mod较小
这里10^9+7 显然存不下 所以直接每次都求一下 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
#define mod 1000000007
using namespace std;
ll Mi(ll a,ll b)
{
    if(b==0)return 1;
    ll x=Mi(a,b/2)%mod;
    x=x*x%mod;
    if(b&1)x=x*a%mod;
    return x;
}
ll C(ll n,ll m)
{
    if(m>n)return 0;
    ll nmj=1,mj=1;
    for(ll i=n;i>=n-m+1;i--)
      nmj=nmj*i%mod;
    for(int i=1;i<=m;i++)//开始以为这句会导致T 后然认真读读题目发现想多了0.0 
      mj=mj*i%mod;
    return (nmj*Mi(mj,mod-2))%mod;
}
ll Lcs(ll n,ll m)
{
    if(m==0)return 1;
    return C(n%mod,m%mod)*Lcs(n/mod,m/mod);
}
int main()
{
    ll n,m;
    cin>>n>>m;
    if(n<m)swap(n,m);
    printf("%lld",(n+Lcs(n+m+1,m))%mod);
}

 

codevs 1515 跳

标签:

原文地址:http://www.cnblogs.com/yanlifneg/p/5525011.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!