1. 程式人生 > >牛客寒假算法基礎集訓營4 F Applese 的大獎

牛客寒假算法基礎集訓營4 F Applese 的大獎

http val adding == div pow 如果 求逆 lns

鏈接:https://ac.nowcoder.com/acm/contest/330/H
來源:牛客網

Applese 和它的小夥伴參加了一個促銷的抽獎活動,活動的規則如下:有一個隨機數生成器,能等概率生成 099

之間的整數,每個參與活動的人都要通過它獲取一個隨機數。最後得到數字最小的 k 個人可以獲得大獎。如果有相同的數,那麽後選隨機數的人中獎。 Applese 自然是最心急的一個,它會搶在第一個去按隨機數。請你幫忙計算一下它能夠中獎的概率。

僅一行三個正整數 n, k, x,分別表示參與抽獎的總人數(包括Applese),中獎的人數和 Applese 獲得的隨機數。
輸出一個正整數表示 Applese 中獎的概率
mod 1e9+7
首先是推出公式,在dalao的幫助下 理解了 枚舉0 ~ k-1 ,因為 App 中獎了 然後就是 p1^i p2^(n-i-1) 其中 p1 為 小於等於 x 的概率 由於涉及除法取摸,需要求逆元。 逆元就是 A*B-1 == 1 (mod p) 把除法換成乘法 先學習了其中一個方法。 如果 a與p互質 可以用 費馬小定理 ap-1 == 1 (mod p) 所以 上式可以寫為 a*ap-2 == 1 (mod p) 那麽 a的逆元就是 ap-2
 1 #include<bits/stdc++.h>
 2
using namespace std; 3 typedef long long ll; 4 const int mod=1e9+7; 5 6 ll powm(ll a,ll b=mod-2) { 7 ll sum=1,tmp=a%mod; 8 while(b) { 9 if(b&1) sum=sum*tmp%mod; 10 tmp=tmp*tmp%mod; 11 b>>=1; 12 } 13 return sum; 14 } 15 16 int main() {
17 int n,k,x; 18 ll val=powm(100); 19 scanf("%d%d%d",&n,&k,&x); 20 ll p1=(x+1)*val%mod; 21 ll p2=(99-x)*val%mod; 22 ll c=1,ans=0; 23 for(int i=0;i<k;i++) { 24 ans=ans+c*powm(p1,i)%mod*powm(p2,n-1-i)%mod; 25 ans=ans%mod; 26 c=c*(n-i-1)%mod*powm(i+1)%mod; 27 } 28 printf("%lld",ans); 29 }

牛客寒假算法基礎集訓營4 F Applese 的大獎