江琛

牛客 抓球

题目网址:B-抓球_哈尔滨理工大学第12届程序设计竞赛(同步赛) (nowcoder.com)

#include <bits/stdc++.h>
using namespace std;
const long long N=1e9+7;
long long fastpow(long long a,long long n)//快速幂
{
long long base=a;
long long res=1;
while(n)
{
if(n&1)
res=(base*res)%N;
base=(base*base)%N;
n=n/2;//等价 n>>=1
}
return res%N;
}
long long inv(long long a)//按照样例题意取模   也就是题目样例给出了求逆元的方法
{
return fastpow(a,N-2);
}
int main()
{

long long t,n,m,k,q,p[300005];
p[0]=1;
for(int i=1;i<=300000;i++)//用数组p存储1-300000的阶乘
{
p[i]=(p[i-1]%N*i%N)%N;
}
cin>>t;
while(t--)
{
cin>>n>>m>>k>>q;
if(k>n)
{
cout<<0<<endl;
continue;
}

long long s=(p[n]*inv(p[n-k]))%N;//连续一次取球的比例的上半部分
long long x=(p[n+m]*inv(p[n+m-k]))%N;//下半部分
cout<<fastpow(s*inv(x)%N,q)<<endl;//概率乘以q次

}
}

 

样例逆元方法:

 1 / 4 = ( 1 * 4 ^ (mod - 2)  )    %  mod       避免精度丢失

 

抓球组合数公式推导:

posted on 2022-05-21 23:29  江琛  阅读(30)  评论(0编辑  收藏  举报

导航