公式为 , 其中的组合数可用形如 的递推式求出来。关键在于如何在5e6的条件下求出逆元,我用费马小定理WA了好几发,最后换成扩展欧几里德过了。

#include<bits/stdc++.h>
using namespace std;
#define int long long
int mod=1e9+7;
int quick(int a,int b){
    int res=1;
    while(b){
        if(b&1){
            res=res*a%mod;
        }
        b>>=1;
        a=a*a%mod;
    }
    return res;
}
int exgcd(int a,int b,int &x,int &y){
    if (!b)
    {
        x = 1; y = 0;
        return a;   
    }
    int d = exgcd(b, a % b, x, y);
    int temp=y;   
    y=x-(a/b)*y;
    x=temp;
    return d;
}

int c[100007];//存组合数
void solve(){
    int n,p,q,sum=0;
    scanf("%lld%lld%lld",&n,&p,&q);
    c[0]=1;
    int d=(q-p)*quick(q,mod-2)%mod;
    int d2=p*quick(q,mod-2)%mod;
    int last=1;
    for(int i=0;i<=n-1;i++){
        int x,y;
        exgcd(i,mod,x,y);
        if(i!=0)c[i]=c[i-1]*(n+i-1)%mod*x%mod;
        sum=(sum+c[i]*last)%mod;
        last=last*d%mod;
    }
    sum=(sum*quick(d2,n))%mod;
    printf("%lld\n",(sum+mod)%mod);
}
signed main(){
    int t;
    scanf("%lld",&t);
    while(t--)solve();
}