BZOJ 3260 跳

Posted on 2016-12-20 14:51  ziliuziliu  阅读(118)  评论(0编辑  收藏  举报

YY一下发现答案基本上就是(n+1)+ΣC(n+i,i),其中i=1...m。

然后发现后面每一项可以递推,只要处理1..m的逆元就好了。

这题很容易爆long long,每一步都要取模。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1000050
#define mod 1000000007
using namespace std;
long long n,m,inv[maxn],prime[maxn],tot=0,ret=1,ans=1;
bool vis[maxn];
void get_table()
{
    inv[1]=1;
    for (long long i=2;i<=maxn-50;i++)
    {
        inv[i]=((-mod/i)*inv[mod%i]%mod+mod)%mod;
        if (!vis[i]) {vis[i]=true;prime[++tot]=i;}
        for (long long j=1;j<=tot && i*prime[j]<=maxn-50;j++)
        {
            vis[i*prime[j]]=true;
            if (!i%prime[j]) break;
        }
    }
}
int main()
{
    scanf("%lld%lld",&n,&m);
    if (n<m) swap(n,m);
    get_table();ans=(2*n+2)%mod;ret=(n+1)%mod;
    for (long long i=2;i<=m;i++)
    {
        ret=ret*((n+i)%mod)%mod*inv[i]%mod;
        ans=(ans+ret)%mod;
    }
    printf("%lld\n",ans);
    return 0;
}