ZCMU-2157(乘法逆元)

ly的旅行计划

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 33  Solved: 10
[Submit][Status][Web Board]

Description

马上就要放暑假了,ly开始准备她的假期旅行计划,她买了一辆很神奇的火车的车票,假设把这辆火车的路线看成一条X轴,ly会在0的位置上车,然后开始她的旅行。这辆神奇的火车有一个神奇的行进规则,当它位于坐标X时,每天它有1/4的概率移动到(X+1),有1/4的概率移动到(X-1),还有1/2的概率会在原地多停一天。
而wjw作为ly的好朋友,当然是希望和ly一起出去玩,但是wjw需要先回家一趟,所以wjw会在坐标点为M的地方等ly,ly现在想知道,她有多大的概率在第N天的时候到达M点见到wjw
显然答案可以被表示成A/B,(A,B互质),并且Q不能被1000000007整除,请输出A(B^-1) mod 1000000007的结果,(B^-1)是B的乘法倒数模1000000007

 

Input

多组数据,第一行包含一个正整数T(T<=10)
然后每行有两个正整数N,M(0<=n,|M|<=100000),如题意

 

 

Output

对每组N,M输出结果

 

Sample Input

2 2 -2 0 0

Sample Output

562500004 1

最近碰到的逆元题目好多。。。

然后搞了搞乘法逆元的模板。。

推导公式:C(n,m+i)*C(n-m-i,i)   /    pow(2,n-m-i-i)*pow(4,m+i+i)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mem(a,b) memset(a,b,sizeof a)
#define INF 0x3f3f3f3f
const ll mod=1e9+7;
const int maxn=100000+10;
ll qpow(ll a,ll b)//快速幂
{
    ll ans=1;
    a%=mod;
    while(b)
    {
        if(b&1) ans*=a%mod;
        b>>=1;a=a*a%mod;
    }
    return ans;
}
void extgcd(ll a,ll b,ll& d,ll& x,ll& y) //拓展欧几德
{
    if(!b)
    {
        d=a;x=1;y=0;
    }
    else
    {
        extgcd(b,a%b,d,y,x); y-=x*(a/b);
    }
}

ll inverse(ll a,ll n) //确认是否互质,只有互质才能逆元
{
    ll d,x,y;
    extgcd(a,n,d,x,y);
    return d==1?(x+n)%n:-1;
}

ll a1[maxn],b1[maxn],c1[maxn];
ll a2[maxn],b2[maxn],c2[maxn];

int main()
{
    a1[0]=a2[0]=b1[0]=b2[0]=c1[0]=c2[0]=1;
    for(int i=1; i<=100000; i++)
    {
        a1[i]=(a1[i-1]*4)%mod;
        b1[i]=(b1[i-1]*2)%mod;
        c1[i]=(c1[i-1]*i)%mod;
        a2[i]=qpow(a1[i],mod-2);
        b2[i]=qpow(b1[i],mod-2);
        c2[i]=qpow(c1[i],mod-2);
    }
    int T;
    scanf("%d",&T);
    ll n,m;
    while(T--)
    {
        scanf("%lld%lld",&n,&m);
        m=abs(m);
        ll rs=0;
        for(int i=0; m+i+i<=n; i++)
            rs=(rs+c1[n]*c2[m+i]%mod*c2[i]%mod*c2[n-m-i-i]%mod*a2[m+i+i]%mod*b2[n-m-i-i]%mod)%mod;
        printf("%lld\n",rs);
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值