ASDFZ 3629 -- 药品试验
题目背景
小 X 是生活在 9102 年的一位高二的 OIer,也是本套模拟题的主角。
小 X 的妹子小 R 在 9102 年高考前两周跟一位高考考生小 Y 跑了,这令小 X 十分不爽。小 X 在睡觉的时候梦到自己也进入了高考考场参加了数学考试,并且通过一道题把小 Y 吊打了。
小 X 醒来后,尽管没有真实发生,但是他对这道题印象深刻,认为这道题是一个 OIer 都能轻松做出来的题,怀着对小 Y 的怨念,他把这题出给了你。
题目描述
为治疗某种疾病,研制了甲、乙两种新药,希望知道哪种新药更有效,为此进行动物试验。
试验方案如下:每一轮选取两只白鼠对药效进行对比试验。对于两只白鼠,随机选一只施以甲药,另一只施以乙药。一轮的治疗结果得出后,再安排下一轮试验。当其中一种药治愈的白鼠比另一种药治愈的白鼠多 n 只时。就停止试验,并认为治愈只数多的药更有效。
为了方便描述问题,约定:对于每轮试验,若施以甲药的白鼠治愈且施以乙药的白鼠未治愈则甲药得 1 分,乙药得 −1 分;若施以乙药的白鼠治愈且施以甲药的白鼠未治愈则乙药得 1 分,甲药得 −1 分;若都治愈或都未治愈则两种药均得 0 分。
甲、乙两种药的治愈率分别记为 α 和 β,一轮实验中甲药的得分记为 X。
若甲药、乙药在试验开始时都赋予 n 分,pi(i=0,1,…,2n)表示 “甲药的累计得分为 i 时,最终认为甲药比乙药更有效” 的概率。则 p0=0,p2n=1,pi=api−1+bpi+cpi+1(i=1,2,…,2n−1,其中 a=P(X=−1),b=P(X=0),c=P(X=1)。
求出 pn 的值,即最终认为甲药比乙药更有效的概率,答案对 1000000007(10^9 + 7一个质数 ) 取模。
如果你对题目有疑问,可以参见提示部分。
Input
输入一行三个正整数,分别为题目中所说的 n,α,β在取模意义下给出。
Output
输出一行一个整数,表示 pnmod 10^9 + 7。
Sample Input
2 500000004 600000005
#2
364 401527355 102420240
Sample Output
352941179
#2
901352382
Sample Explanation
#1α≡0.5(mod109+7),β≡0.8(mod109+7,则有 a=0.4,b=0.5,c=0.1。
可以求得 p0=0,p1=1/85,p2=1/17,p3=21/85,p4=1。
Source
思路
求a,b,c,求p0,p1,递推求pn
求x 完事儿~~
这个原理对概率同样适用
两个事件同时发生概率即是分别发生的概率乘积
比如甲有用,乙有用两件事同时发生
你把右边的pn移到左边
就是递推公式
甲有用乙没用就是α(1-β)
甲没用乙有用就是β(1-c)
β=1-α-c
代码
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N=20000010; const int Mod=1000000007; int p[N]; long long n,A,B,a,b,c,cn; long long qmod(long long a,long long b) { long long ans=1; while(b) { if(b&1) ans=ans*a%Mod; a=a*a%Mod; b/=2; } return ans; } int main () { scanf("%lld%lld%lld",&n,&A,&B); a=(Mod+1-A)*B%Mod; b=(2*A*B%Mod+2*Mod+1-A-B)%Mod; c=(Mod+1-B)*A%Mod; cn=qmod(c,Mod-2); p[1]=1; p[2]=(Mod+1-b)%Mod*cn%Mod; for(int i=3; i<=n*2; i++) p[i]=((Mod+1-b)*p[i-1]%Mod+Mod-a*p[i-2]%Mod)%Mod*cn%Mod; long long s=qmod(p[n*2],Mod-2); printf("%lld\n",s*p[n]%Mod); return 0; }