101343A On The Way to Lucky Plaza
阿新 • • 發佈:2018-12-19
題目地址 題意:有m個商店,Alaa想買k個巧克力,每個商店只能買一塊巧克力,Alaa進每個商店的概率是一樣的,問你在買第k個巧克力的時候是在第n家店的概率是多少,然後答案化成分數取模的形式。 其實挺簡單的,就是坑有點。。。 我們可以知道要求的概率為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;
}