牛客练习赛46----C-华华跟奕奕玩游戏

2024-03-17 12:10

本文主要是介绍牛客练习赛46----C-华华跟奕奕玩游戏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先发出题目链接:
链接:https://ac.nowcoder.com/acm/contest/894/C
来源:牛客网
涉及:逆元,递推式


题目如下:
在这里插入图片描述
在这里插入图片描述
关于这个题首先要抓住一个重点,就是每一轮过后,期望就会发现变化,即:

相邻两轮游戏后的期望值是有一个递推关系的

假设第kk轮后黑球数量的期望是a[k]

只要先找到a[k]与a[k+1]的关系,然后通过递推关系找到a[k]的通项公式,并把a[k]的通项公式表示为分数的形式,然后利用分数取模找逆元,就可以得到答案。


首先找递推公式:

由于每一轮游戏都会放入一个球,并拿走一个球,所以盒子中球的数量肯定是不变的

由于第k轮后盒子里还剩a[k]个球,那么第k+1轮后,盒子里的黑球数量只有三种可能:
  1.多放了一个黑球,即有a[k]+1个球;
  2.仍然是a[k]个球;
  3.拿走了一个黑球,即有a[k]-1个球;

在来考虑每一种情况的概率:
1.多放了一个黑球,即有a[k]+1个黑球
 则第k+1轮放了一个黑球(注意此时盒子里应该有n+m+1个球,有a[k]+1个黑球),拿了一个蓝球。
 
放黑球的概率是p,拿蓝球的概率是 n + m + 1 − a [ k ] − 1 n + m + 1 \frac{n+m+1-a[k]-1}{n+m+1} n+m+1n+m+1a[k]1,则此情况的概率:
p ∗ ( n + m + 1 − a [ k ] − 1 ) n + m + 1 \frac{p*(n+m+1-a[k]-1)}{n+m+1} n+m+1p(n+m+1a[k]1)
 
2.拿走了一个黑球,即有a[k]-1个黑球
 则第k+1轮放了一个蓝球(注意此时盒子里应该有n+m+1个球,有a[k]个黑球),拿了一个黑球。

放蓝球的概率是(1-p),拿黑球的概率是 a [ k ] n + m + 1 \frac{a[k]}{n+m+1} n+m+1a[k],则此情况的概率:
( 1 − p ) ∗ a [ k ] n + m + 1 \frac{(1-p)*a[k]}{n+m+1} n+m+1(1p)a[k]
 
3.仍然是a[k]个黑球(此情况有两种可能)
 当第k+1轮放了一个蓝球(注意此时盒子里应该有n+m+1个球,有a[k]个黑球),则拿了一个蓝球。
 
放蓝球的概率是(1-p),拿蓝球的概率是 n + m + 1 − a [ k ] n + m + 1 \frac{n+m+1-a[k]}{n+m+1} n+m+1n+m+1a[k]
 
 当第k+1轮放了一个黑球(注意此时盒子里应该有n+m+1个球,有a[k]+1个黑球),则拿了一个黑球。
 
放黑球的概率是p,拿黑球的概率是 a [ k ] + 1 n + m + 1 \frac{a[k]+1}{n+m+1} n+m+1a[k]+1

则此情况概率为:
( 1 − p ) ∗ ( n + m + 1 − a [ k ] ) n + m + 1 + p ∗ ( a [ k ] + 1 ) n + m + 1 \frac{(1-p)*(n+m+1-a[k])}{n+m+1}+\frac{p*(a[k]+1)}{n+m+1} n+m+1(1p)(n+m+1a[k])+n+m+1p(a[k]+1)

情况k+1轮后黑球个数此情况概率
多放了一个黑球a[k]+1 p ∗ ( n + m + 1 − a [ k ] − 1 ) n + m + 1 \frac{p*(n+m+1-a[k]-1)}{n+m+1} n+m+1p(n+m+1a[k]1)
拿走了一个黑球a[k]-1 ( 1 − p ) ∗ a [ k ] n + m + 1 \frac{(1-p)*a[k]}{n+m+1} n+m+1(1p)a[k]
仍然是a[k]个球a[k] ( 1 − p ) ∗ ( n + m + 1 − a [ k ] ) n + m + 1 + p ∗ ( a [ k ] + 1 ) n + m + 1 \frac{(1-p)*(n+m+1-a[k])}{n+m+1}+\frac{p*(a[k]+1)}{n+m+1} n+m+1(1p)(n+m+1a[k])+n+m+1p(a[k]+1)

如上表所示,a[k+1]期望为:
[ a [ k ] + 1 n + m + 1 a [ k ] + n + m + 1 − a [ k ] − 1 n + m + 1 ( a [ k ] + 1 ) ] p + [ n + m + 1 − a [ k ] n + m + 1 a [ k ] + a [ k ] n + m + 1 ( a [ k ] − 1 ) ] ( 1 − p ) [\frac{a[k]+1}{n+m+1}a[k]+\frac{n+m+1-a[k]-1}{n+m+1}(a[k]+1)]p+[\frac{n+m+1-a[k]}{n+m+1}a[k]+\frac{a[k]}{n+m+1}(a[k]-1)](1-p) [n+m+1a[k]+1a[k]+n+m+1n+m+1a[k]1(a[k]+1)]p+[n+m+1n+m+1a[k]a[k]+n+m+1a[k](a[k]1)](1p)
经化简可得:
a [ k + 1 ] = ( a [ k ] + p ) n + m n + m + 1 a[k+1]=(a[k]+p)\frac{n+m}{n+m+1} a[k+1]=(a[k]+p)n+m+1n+m


再找通项公式:

为了方便计算,我们设尝数q= n + m n + m + 1 \frac{n+m}{n+m+1} n+m+1n+m

即:
a [ k + 1 ] = q ( a [ k ] + p ) = q ∗ a [ k ] + q p a[k+1]=q(a[k]+p)=q*a[k]+qp a[k+1]=q(a[k]+p)=qa[k]+qp

为了得到通项公式,再设常数x,使得
a [ k + 1 ] + x = q ( a [ k ] + x ) = q ∗ a [ k ] + q x a[k+1]+x=q(a[k]+x)=q*a[k]+qx a[k+1]+x=q(a[k]+x)=qa[k]+qx

则qx-x=qp,解得
x = q p q − 1 x=\frac{qp}{q-1} x=q1qp

又因为a[0]=n,可以得到:

a [ k ] + q p q − 1 a[k]+\frac{qp}{q-1} a[k]+q1qp是以 ( n + q p q − 1 ) (n+\frac{qp}{q-1}) (n+q1qp)为首项,q为公比的等比数列


a [ k ] + q p q − 1 = ( n + q p q − 1 ) ∗ q k ( k ≥ 0 ) a[k]+\frac{qp}{q-1}=(n+\frac{qp}{q-1})*q^{k} (k\ge0) a[k]+q1qp=(n+q1qp)qk (k0)

a [ k ] = ( n + q p q − 1 ) ∗ q k − q p q − 1 ( k ≥ 0 ) a[k]=(n+\frac{qp}{q-1})*q^{k}-\frac{qp}{q-1} (k\ge0) a[k]=(n+q1qp)qkq1qp (k0)
最后,把 p = a b , q = n + m n + m + 1 p=\frac{a}{b},q=\frac{n+m}{n+m+1} p=ba,q=n+m+1n+m代入,得到
a [ k ] = [ n − a b ( n + m ) ] ( n + m ) k ( n + m + 1 ) k + a b ( n + m ) a[k]=[n-\frac{a}{b}(n+m)]\frac{(n+m)^{k}}{(n+m+1)^{k}}+\frac{a}{b}(n+m) a[k]=[nba(n+m)](n+m+1)k(n+m)k+ba(n+m)
分数统一化,得到
a [ k ] = ( b n − a n − a m ) ( n + m ) k + a ( n + m ) ( n + m + 1 ) k b ( n + m + 1 ) k ( k ≥ 0 ) a[k]=\frac{(bn-an-am)(n+m)^{k}+a(n+m)(n+m+1)^{k}}{b(n+m+1)^{k}}  (k\ge0) a[k]=b(n+m+1)k(bnanam)(n+m)k+a(n+m)(n+m+1)k  (k0)


分数取模,找逆元:

最后期望
分子fa
f a = ( b n − a n − a m ) ( n + m ) k + a ( n + m ) ( n + m + 1 ) k fa=(bn-an-am)(n+m)^{k}+a(n+m)(n+m+1)^{k} fa=(bnanam)(n+m)k+a(n+m)(n+m+1)k
分母fb
f b = b ( n + m + 1 ) k fb=b(n+m+1)^{k} fb=b(n+m+1)k
我们只考虑余数,所以还需讲fa与fb对mod取余

ll pa=qPow_function(n+m+1,k,mod);
ll pb=qPow_function(n+m,k,mod);
ll fa=((b*n%mod-a*n%mod-a*m%mod)*pb%mod+((a*(n+m)%mod)%mod*pa)%mod)%mod;//多用取余,不然很可能就爆
ll fb=b*pa%mod;

分数取模( a b M O D p \frac{a}{b}MOD p baMODp),由于mod=1e9+7是一个质数,可以使用费马小定理求解

a b M O D p = ( a ∗ c ) M O D p \frac{a}{b}MOD p=(a*c)MODp baMODp=(ac)MODp
(其中c是b MOD p的逆元,mod是质数,因此c=bp-2%p)

ll ni=qPow_function(fb,mod-2,mod);//ni是逆元
return !(cout<<(fa*ni%mod+mod)%mod);//注意fa可能是负数,所以要再加mod并模上mod

举例子:
过程只有套fa和fb以及求逆元公式,过于简单,不用举例子,注意要用快速幂 ( n + m ) k (n+m)^{k} (n+m)k ( n + m + 1 ) k (n+m+1)^{k} (n+m+1)k


代码如下:

#include <iostream>
#define mod (ll)1000000007
using namespace std;
typedef long long ll;
ll n,m,k,a,b;
long long qPow_function(long long _x,long long _divisor,long long _mod){//快速幂long long sum=1;while(_divisor){if(_divisor&1)    sum=sum*_x%_mod;_divisor=_divisor>>1;_x=_x*_x%_mod;}return sum;
}
int main(){cin>>n>>m>>k>>a>>b;ll pa=qPow_function(n+m+1,k,mod);//pa是(n+m+1)的k次方ll pb=qPow_function(n+m,k,mod);//pb是(n+m)的k次方ll fa=((b*n%mod-a*n%mod-a*m%mod)*pb%mod+((a*(n+m)%mod)%mod*pa)%mod)%mod;//套fa公式得分子ll fb=b*pa%mod;//套公式ll ni=qPow_function(fb,mod-2,mod);//求fb模mod的逆元return !(cout<<(fa*ni%mod+mod)%mod);
}

这篇关于牛客练习赛46----C-华华跟奕奕玩游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/818915

相关文章

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

牛客小白月赛100部分题解

比赛地址:牛客小白月赛100_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A.ACM中的A题 #include<bits/stdc++.h>using namespace std;#define ll long long#define ull = unsigned long longvoid solve() {ll a,b,c;cin>>a>>b>

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II 1.题目 1.1递增子序列 题目链接:491. 非递减子序列 - 力扣(LeetCode) 视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0491.%E9%80%92%E

牛客小白月赛100(A,B,C,D,E,F三元环计数)

比赛链接 官方讲解 这场比较简单,ABC都很签到,D是个不太裸需要预处理的 B F S BFS BFS 搜索,E是调和级数暴力枚举,F是三元环计数。三元环考的比较少,没见过可能会偏难。 A ACM中的A题 思路: 就是枚举每个边变成原来的两倍,然后看看两短边之和是否大于第三边即可。 不能只给最短边乘 2 2 2,比如 1 4 8 这组数据,也不能只给第二短边乘 2 2 2,比

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ

天然药物化学史话:“四大光谱”在天然产物结构鉴定中的应用-文献精读46

天然药物化学史话:“四大光谱”在天然产物结构鉴定中的应用,天然产物化学及其生物合成必备基础知识~ 摘要 天然产物化学研究在药物研发中起着非常重要的作用,结构研究又是天然产物化学研究中最重要的工作之一。在天然药物化学史话系列文章的基础上,对在天然产物结构研究中起绝对主导作用的“四大光谱”分析技术,即红外光谱、紫外光谱、质谱、核磁共振波谱在天然产物结构鉴定中的应用历史进行回顾与总结,并对其发展

每日OJ_牛客_求和(递归深搜)

目录 牛客_求和(递归深搜) 解析代码 牛客_求和(递归深搜) 求和_好未来笔试题_牛客网 解析代码         递归中每次累加一个新的数,如果累加和大于等于目标,结束递归。此时如果累加和正好等于目标,则打印组合。向上回退搜索其它组合。此题本身就是一个搜索的过程,找到所有的组合。 #include <iostream>#include <cmath>#in

牛客《剑指Offer》 -- 数值的整数次方

题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 思路 特别注意负数的情况,出现负数,将其转化为正数然后求倒数。 class Solution {public:double Power(double base, int exponent) {double total = 1;bool flag = false

牛客网《剑指Offer》 二进制中1的个数

题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 思路 负数用补码,其实就是求一个数据在计算机中是存储是怎么样子的。用位运算,就能很好实现。 class Solution {public:int NumberOf1(int n) {int count = 0;int flag = 1;while (flag != 0) {if ((n & f

牛客网《剑指Offer》 矩形覆盖

题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? class Solution {public:int rectCover(int number) {if(number==0) return 0;if(number==1) return 1;if(number==2) return 2;retu