牛客等级之题8.3——题解

等级之题 N1(8.3)

题目描述
有一个箱子,开始时有n个黑球,m个蓝球。每一轮游戏规则如下:
第一步:奕奕有p的概率往箱子里添加一个黑球,有(1-p)的概率往箱子里添加一个蓝球。
第二步:华华随机从箱子里取出一个球。
华华喜欢黑球,他想知道k轮游戏之后箱子里黑球个数的期望。
牛客等级之题8.3——题解_第1张图片
示例1
输入
2 2 1 1 2
输出
2
示例2
输入
2 2 2 3 10
输出
184000003

思路: 对于第i天的黑球期望 dp[i] = dp[i-1] + p×1 -(dp[i-1] + p×1)(m+n+1),直观上理解,第i天黑球期望等于前一天的期望数加上第一步取得黑球的期望 p×1 ,再减去第二步取出黑球的期望,注意到无论哪一轮,第二步的时候总球数一定是n+m+1,则随机取到黑球期望为 (dp[i-1] + p×1)/(n+m+1)×1。就可以推到dp[i]了。化简后可以用矩阵快速幂算,进一步化简后只需算一个等比数列,用快速幂推就可以了。

题解:
牛客等级之题8.3——题解_第2张图片
注意: 这题还是有点东西的,主要是逆元和模方面的细节含模运算过程如果有减法一定要
(a-b)%mod = ((a%mod-b%mod)+mod)%mod
,不然会出错。

#include
#define IOS ios::sync_with_stdio(false);cin.tie(0)
const int mod = 1e9+7;
typedef long long ll;
using namespace std;

ll qpow(ll x,ll n)
{
    ll res = 1;
    while(n)
	{
        if(n%2 == 1)
            res = res*x%mod;
        x = x*x%mod;
        n /= 2;
    }
    return res;
}
 
void work(){
    ll n,m,k,a,b;
    cin>>n>>m>>k>>a>>b;
    ll p = a*qpow(b,mod-2)%mod;
    ll s = (n+m)%mod*qpow(n+m+1,mod-2)%mod;
    ll cc = n*qpow(s,k)%mod;
    ll aa = p*(((s-qpow(s,k+1)%mod)+mod)%mod)%mod*qpow(((1-s)+mod)%mod,mod-2)%mod;//**注意
    cout<<(cc+aa)%mod<<endl;
 
}
 
int main()
{
    IOS;
    work();
    return 0;
}

等级之题 N2(8.3)

牛客等级之题8.3——题解_第3张图片
输入描述:
输入一个正整数s表示红色部分的面积。
1<=s<=1e9
输出描述:
输出一个小数表示大圆的最小半径,保留三位小数
示例1
输入
2
输出
1.596
示例2
输入
3
输出
1.954
在这里插入图片描述

#include
using namespace std;
double PI=acos(-1.0);

int main()
{
    double s;
	cin>>s;
    printf("%.3f\n",2.0*sqrt(s/PI));
    return 0;
}

你可能感兴趣的:(思维,题解,算法)