191108-考试-T1-药品试验

题目背景

2019 2019 2019 年高考全国卷 I I I 理科数学 21 21 21 题。

题目描述

为治疗某种疾病,小F研制了甲、乙两种新药,他希望知道哪种新药更有效,为此进行动
物试验。

试验方案如下:每一轮选取两只白鼠对药效进行对比试验。对于两只白鼠,随机选
一只施以甲药,另一只施以乙药。一轮的治疗结果得出后,再安排下一轮试验。当其中
一种药治愈的白鼠比另一种药治愈的白鼠多 n n n 只时。就停止试验,并认为治愈只数多
的药更有效。

为了方便描述问题,约定对于每轮试验,若施以甲药的白鼠治愈且施以乙药的白
鼠未治愈则甲药得 + 1 +1 +1 分,乙药得 − 1 −1 1 分;若施以乙药的白鼠治愈且施以甲药的白鼠未治
愈则乙药得 + 1 +1 +1 分,甲药得 − 1 −1 1 分;若都治愈或都未治愈则两种药均得 0 0 0 分。
甲、乙两种药的治愈率分别记为 α \alpha α β \beta β ,一轮实验中甲药的得分记为 X X X

若甲药、乙药在试验开始时都赋予 n n n 分, p i ( i = 0 , 1 , . . . , 2 n ) p_i(i = 0, 1, . . . , 2n) pi(i=0,1,...,2n) 表示“甲药的累计得分为
i i i 时,最终认为甲药比乙药更有效”的概率。则 p 0 = 0 , p 2 n = 1 , p i = a ∗ p i − 1 + b ∗ p i + c ∗ p i + 1 ( i = 1 , 2 , . . . , 2 n − 1 ) p_0=0, p_{2n} = 1, p_i = a*p_{i−1}+b*p_i+c*p_{i+1}(i=1, 2, . . . , 2n−1) p0=0,p2n=1,pi=api1+bpi+cpi+1(i=1,2,...,2n1) ,其中 a = P ( X = − 1 ) , b = P ( X = 0 ) , c = P ( X = + 1 ) a=P(X=−1),b=P(X=0),c=P(X=+1) a=P(X=1),b=P(X=0),c=P(X=+1)
求出 p n p_n pn 的值,即最终认为甲药比乙药更有效的概率,答案对 1 , 000 , 000 , 007 1,000,000,007 1,000,000,007 (一个质数) 取模。

输入格式

输入一行三个正整数,分别为题目中所说的 n , α , β n,\alpha,\beta n,α,β, 其中 α , β \alpha,\beta α,β 在取模意义下给出。

输出格式

输出一行一个整数,表示 p n m o d    1 0 9 + 7 p_n\mod 10^9+7 pnmod109+7

输入样例

2 500000004 600000005
说明: α = 1 2 , β = 4 5 \alpha=\frac{1}{2} , \beta=\frac{4}{5} α=21,β=54 ,可知 a = 1 10 , b = 1 2 , c = 2 5 a=\frac{1}{10},b=\frac{1}{2},c=\frac{2}{5} a=101,b=21,c=52

输出样例

352941179
说明: p 0 = 0 , p 1 = 1 85 , p 2 = 1 17 , p 3 = 21 85 , p 4 = 1 p_0=0,p_1=\frac{1}{85},p_2=\frac{1}{17},p_3=\frac{21}{85},p_4=1 p0=0,p1=851,p2=171,p3=8521,p4=1 p 2 p_2 p2 取模后等于输出样例。

测试点与提示

在这里插入图片描述
题目中的 P ( X = − 1 ) , P ( X = 0 ) , P ( X = + 1 ) P(X=−1),P(X=0),P(X=+1) P(X=1),P(X=0),P(X=+1) 分别表示 X = − 1 , 0 , + 1 X=−1,0,+1 X=1,0,+1 时的概率。

对于有理数 p q ( gcd ⁡ ( p , q ) = 1 ) \frac{p}{q}(\gcd(p, q)=1) qp(gcd(p,q)=1) ,对质数 m m m 取模的结果即为满足 q x ≡ p     ( m o d    m ) qx \equiv p~~~(\mod m) qxp   (modm)
最小的非负整数 x x x 。根据费马小定理,当 gcd ⁡ ( q , m ) = 1 \gcd(q,m)=1 gcd(q,m)=1 时, x = p ∗ q m − 2 m o d    m x=p*q^{m−2}\mod m x=pqm2modm

解析

PART I
求出模意义下的 a , b , c a,b,c a,b,c ,这个初中学过。

a = P ( X = − 1 ) = ( 1 − α ) ∗ β a=P(X=−1)=(1−\alpha)*\beta a=P(X=1)=(1α)β b = P ( X = 0 ) = α ∗ β + ( 1 − α ) ∗ ( 1 − β ) b=P(X=0)=\alpha*\beta+(1-\alpha)*(1−\beta) b=P(X=0)=αβ+(1α)(1β) c = P ( X = + 1 ) = α ∗ ( 1 − β ) c=P(X=+1)=\alpha*(1−\beta) c=P(X=+1)=α(1β)

PART II
求逆元来找答案,不用求出到底分子分母到底是多少,只管模以后的值就行了(参考题 有理数取余 )。某马小定理已经提示我们要用逆元,因此所有的除法都可以转化为它的逆元相乘,经试验,对答案不会造成影响。对于幂,只需要用龟速幂就行了。

PART III
p i = a ∗ p i − 1 + b ∗ p i + c ∗ p i + 1 p_i = a*p_{i−1}+b*p_i+c*p_{i+1} pi=api1+bpi+cpi+1 可以推出,令 k = i + 1 k=i+1 k=i+1 ,则有

p k = ( 1 − b ) ∗ p k − 1 − a ∗ p k − 2 c p_k=\frac{(1-b)*p_{k-1}-a*p_{k-2}}{c} pk=c(1b)pk1apk2

p 1 = x p_1=x p1=x (一个单位),可以用 k i ∗ x k_i*x kix 的形式表示 p 2 , p 3 , . . . , p 2 n p_2,p_3,...,p_{2n} p2,p3,...,p2n ,用 p 2 n = 1 p_{2n}=1 p2n=1 可以解出 x x x (因为是 p 2 n p_{2n} p2n 个单位,求 1 1 1 个单位是多少),再代入 p n = k n ∗ x p_n=k_n*x pn=knx 即可求出 p n p_n pn (所有除全部改为乘它的逆元,由于用于除的数只有 c c c ,开头预处理出 c c c 的逆元)。

其实还有优于 O ( n ) O(n) O(n) 的算法,只是太过玄学,就暂且不提。

Code

#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
const int mod=1000000007;
inline int Read(){
	register int x=0,f=1;
	register char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return f*x;
}
inline void Write(int x){
	if(x<0){putchar('-');x=-x;}
	if(x>=10)Write(x/10);
	putchar(x%10+48);
}
int n,arf,bet,a,b,c,invc,p[55667788];
int turtle(int bb,int pp,int kk){
	int ss=1;
	while(pp){
		if(pp&1)ss=ss*bb%kk;
		bb=bb*bb%kk,pp>>=1;
	}
	return ss;
}
signed main(){
	n=Read(),arf=Read(),bet=Read();
	a=(1+mod-arf)*bet%mod;//取模过后的有理数直接用就行了 
	b=(arf*bet+(1+mod-arf)*(1+mod-bet))%mod;
	c=(1+mod-bet)*arf%mod;
	invc=turtle(c,mod-2,mod);p[1]=1;//除一个数等于乘它的逆元设p1为x假定1个单位大小 
	for(int i=2;i<=(n<<1);i++)p[i]=((p[i-1]*(1+mod-b)+(mod-a)*p[i-2])+mod)%mod*invc%mod;
	//设p1为x,从0正推分子是多少(用kx的方式表示pi)
	Write(turtle(p[n<<1],mod-2,mod)*p[n]%mod);//龟速乘求逆元,答案=p[n]/p[n<<1](就是1)
	return 0;
}

加油!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值