题目地址
题意:有m个商店,Alaa想买k个巧克力,每个商店只能买一块巧克力,Alaa进每个商店的概率是一样的,问你在买第k个巧克力的时候是在第n家店的概率是多少,然后答案化成分数取模的形式。
其实挺简单的,就是坑有点。。。
我们可以知道要求的概率为 C(n−1,k−1)× p(k−1) × (1−p)(n−k)×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;
}