洛谷B4337 [中山市赛 2023] 简单数学题

Problem Discription\color{blue}{\texttt{Problem Discription}}Problem Discription

1≤n,max⁡{a1,a2,b1,b2}≤1×10181 \leq n, \max \{ a_{1},a_{2},b_{1},b_{2} \} \leq 1 \times 10^{18}1≤n,max{a1,a2,b1,b2}≤1×1018。

Analysis\color{blue}{\texttt{Analysis}}Analysis

令 A=a1+a2,B=b1+b2A=a_{1}+a_{2},B=b_{1}+b_{2}A=a1+a2,B=b1+b2,分别表示两个盒子里球的总数。设 T=a1+b1T=a_{1}+b_{1}T=a1+b1 表示白球的总数。

假设第 iii 轮操作后第一个盒子里期望还有 fif_{i}fi 个白球,则期望有 (A−fi)(A-f_{i})(A−fi) 个黑球。则第二个盒子里期望还有 (T−fi)=gi(T-f_{i})=g_{i}(T−fi)=gi 个白球,期望有 B−gi=B+fi−TB-g_{i}=B+f_{i}-TB−gi=B+fi−T 个黑球。

则,从第一个盒子里随机选取一个球放入第二个盒子的过程,有 fiA\frac{f_{i}}{A}Afi 的概率会让第二个盒子多一个白球,则

hi+1=gi+fiAh_{i+1}=g_{i}+\dfrac{f_{i}}{A}hi+1=gi+Afi

即当前第二个盒子里期望有 (gi+fiA)\left ( g_{i}+\frac{f_{i}}{A} \right )(gi+Afi) 个白球和 (B+1−gi−fiA)\left (B+1-g_{i}-\frac{f_{i}}{A} \right )(B+1−gi−Afi) 个黑球。

因此,从第二个盒子向第一个盒子拿球的过程,会使第一个盒子有 gi+fiAB+1\dfrac{g_{i}+\frac{f_{i}}{A}}{B+1}B+1gi+Afi 的概率多一个白球。

由期望的线性可加性,可得

fi+1=fi−fiA+gi+fiAB+1=fi−fiA+T−fi+fiAB+1=(1−1A)fi+TB+1−(1−1A)fiB+1=(1−1A)(1−1B+1)fi+TB+1\begin{aligned} f_{i+1}&=f_{i}-\dfrac{f_{i}}{A}+\dfrac{g_{i}+\dfrac{f_{i}}{A}}{B+1}\\ &= f_{i}-\dfrac{f_{i}}{A}+\dfrac{T-f_{i}+\dfrac{f_{i}}{A}}{B+1} \\ &= \left ( 1 - \dfrac{1}{A} \right )f_{i}+\dfrac{T}{B+1} - \dfrac{\left ( 1 - \dfrac{1}{A} \right )f_{i}}{B+1}\\ &= \left ( 1 - \dfrac{1}{A} \right ) \left (1 - \dfrac{1}{B+1} \right ) f_{i}+\dfrac{T}{B+1} \end{aligned}fi+1=fi−Afi+B+1gi+Afi=fi−Afi+B+1T−fi+Afi=(1−A1)fi+B+1T−B+1(1−A1)fi=(1−A1)(1−B+11)fi+B+1T

于是得到了关于 fff 的递推式:

fi+1=(A−1)BA(B+1)fi+TB+1f_{i+1}=\dfrac{(A-1)B}{A(B+1)}f_{i}+\dfrac{T}{B+1}fi+1=A(B+1)(A−1)Bfi+B+1T

令 p=(A−1)BA(B+1),q=TB+1p=\frac{(A-1)B}{A(B+1)},q=\frac{T}{B+1}p=A(B+1)(A−1)B,q=B+1T,则 fi+1=pfi+qf_{i+1}=pf_{i}+qfi+1=pfi+q。

其中 f0=a1f_{0}=a_{1}f0=a1。

将 fff 的表达式层层展开,可以得到

fn=pna1+q⋅pn−1p−1f_{n}=p^{n}a_{1}+q \cdot \dfrac{p^{n}-1}{p-1}fn=pna1+q⋅p−1pn−1

利用快速幂,可以在 O(log⁡n)O(\log n)O(logn) 的时间复杂度内得到答案。

Code\color{blue}{\text{Code}}Code

cpp 复制代码
typedef long long ll;
const int mod=998244353;

ll a1,a2,b1,b2,n;
int A,B,T,ans,p,q;

int ksm(int a,int b){
	int res=1;
	while (b){
		if (b&1) res=1ll*res*a%mod;
		a=1ll*a*a%mod;b>>=1; 
	}
	
	return res;
}

int main(){
	cin>>n>>a1>>a2>>b1>>b2;
	
	a1%=mod;a2%=mod;
	b1%=mod;b2%=mod;
	
	A=(a1+a2)%mod;
	B=(b1+b2)%mod;
	T=(a1+b1)%mod;
	
	p=1ll*(A-1)*B%mod*ksm(1ll*A*(B+1)%mod,mod-2)%mod;
	q=1ll*T*ksm(B+1,mod-2)%mod;
	
	n%=(mod-1);
	ans=(1ll*a1*ksm(p,n)%mod+1ll*q*((ksm(p,n)%mod+mod-1)%mod)%mod*ksm(p-1,mod-2)%mod)%mod;
	
	ans=1ll*ans*ksm(A,mod-2)%mod; 
	
	printf("%d",ans);
	
	return 0;
}
相关推荐
郝学胜-神的一滴1 小时前
C++11 工程级应用 12:编译期类型魔法,干掉重复与臃肿的代码
开发语言·数据结构·c++·软件工程·visual studio
pen-ai1 小时前
【优化方法】为什么梯度是最陡峭的方向?
人工智能·算法·机器学习·最小二乘法
个 人 练 习 生1 小时前
数据结构:排序算法详解
c语言·数据结构·经验分享·学习·算法·排序算法
m0_734571761 小时前
深入理解C++ 析构函数<四>虚析构函数
开发语言·c++
青山木1 小时前
枚举类DP进阶:完全平方数与零钱兑换
java·数据结构·算法·leetcode·动态规划
学习智者2 小时前
《玄》IDE v3.8.2重磅发布:数据外置+全链路优化
开发语言·c++·ide·中文语言 玄
2601_9622186110 小时前
万象生鲜系统业财一体化底层打通技术自动生成经营账单
大数据·数据库·人工智能·python·算法
anew___10 小时前
蜂鸣器播放音乐——让 Arduino 唱出旋律
c++·stm32·单片机·嵌入式硬件·c