题目地址
题意:有m个商店,Alaa想买k个巧克力,每个商店只能买一块巧克力,Alaa进每个商店的概率是一样的,问你在买第k个巧克力的时候是在第n家店的概率是多少,然后答案化成分数取模的形式。
其实挺简单的,就是坑有点。。。
我们可以知道要求的概率为 C ( n 1 , k 1 ) × C(n-1, k-1)\times C(n1,k1)× p ( k 1 ) p^(k-1) p(k1) × \times × ( 1 p ) ( n k ) × (1-p)^(n-k)\times (1p)(nk)×p
大概的思路是把p转化为分数,然后分子分母按照上面的式子算一下就行了。。。。
但是坑点是要判一下(n>k)的时候(不然会T), 概率化为分母的时候要加eps(微笑脸???)然后注意一下有没有爆ll就行了。

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) ((x)&(-x))
typedef long long ll;
const int maxn = 1e5+5;
const ll mod = 1e9+7;
int Case = 1;
ll gcd(ll a, ll b) {
	return b==0?a:gcd(b, a%b);
}
ll Power(ll a, ll b) {
	ll res = 1, base = a;
	while(b) {
		if(b&1) res = res*base%mod;
		b = b>>1ll;
		base = base*base%mod;
	}
	return res;
}
ll inv[maxn],fac[maxn];
ll C(ll n, ll m) {
	fac[0] = 1;
	if(m==0||n==m) return 1;
	for(ll i = 1; i <= n; i++) fac[i] = fac[i-1]*i%mod;
	inv[n] = Power(fac[n], mod-2);
	for(ll i = n-1; i >= 1; i--) inv[i] = inv[i+1]*(i+1)%mod;
	return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
ll n, m, k;
void solve() {
	double p;
	cin>>m>>n>>k>>p;
	if(k>n||n>m) {
		cout<<"0\n";
		return;
	}
	ll A = p*1000+1e-10, B = 1000;
	ll temp = gcd(A, B);
	A = A/temp;B = B/temp;
	A = Power(A, k)*C(n-1, k-1)%mod*Power((B-A), n-k)%mod;
	B = Power(B, n);
	cout<<A*Power(B,mod-2)%mod<<endl;
}

int main() {
    ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
    //freopen("/Users/hannibal_lecter/Desktop/code/in.txt", "r", stdin);
    //freopen("/Users/hannibal_lecter/Desktop/code/out.txt","w",stdout);
#endif
    while(Case--) {
        solve();
    }
    return 0;
}