洛谷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;
}
相关推荐
seowmt13 小时前
GEO效果该什么时候看数据:从立项到复盘的时间线复盘
算法·ip·seo·geo·faq
悠仁さん13 小时前
【算法C++】双指针(一)
数据结构·c++·算法
jimy113 小时前
lvalue、xvalue、prvalue(二):引用是哪一类?
开发语言·c++·1024程序员节
小豆庄13 小时前
本地视频脱敏的追踪系统踩坑——车牌过滤、转场误判与ID冲突排查
人工智能·算法·目标检测·音视频·视频·敏捷流程·纹理贴图
忆挽篱笙歌13 小时前
进程替换函数与shenll命令行解释器
前端·javascript·算法
YukiRinLL13 小时前
字符串存储与 BF、KMP 匹配算法
数据结构·算法
小超人诞生日记13 小时前
Linux:环境变量 & 进程虚拟地址空间
linux·算法
杜 硕13 小时前
从零开始的C++生活——第三讲
开发语言·c++·生活
小白起 v13 小时前
【算法学习 · 01】深入理解大 O 表示法:从「能跑就行」到「专业评估」算法性能
算法
梦帮科技13 小时前
脑机接口(BCI)与神经系统安全:EEG 神经电信号欺骗注入、神经闭环解码算法与生物黑客反制
算法·安全