1. 程式人生 > >101343A On The Way to Lucky Plaza

101343A On The Way to Lucky Plaza

題目地址 題意:有m個商店,Alaa想買k個巧克力,每個商店只能買一塊巧克力,Alaa進每個商店的概率是一樣的,問你在買第k個巧克力的時候是在第n家店的概率是多少,然後答案化成分數取模的形式。 其實挺簡單的,就是坑有點。。。 我們可以知道要求的概率為C(n1,k1)×C(n-1, k-1)\timesp(k1)p^(k-1)×\times(1p)(nk)×(1-p)^(n-k)\timesp 大概的思路是把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; }