洛谷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;
}
相关推荐
H.莓飛18 小时前
【数据结构】栈_OJ题
linux·数据结构·算法·centos
Zootopia62618 小时前
多架 eVTOL集群排班调度方案思考
人工智能·算法·数学建模·matlab·动态规划·无人机·evtol
可乐ea18 小时前
GitHub Security Lab 开源 Fuzzing Taskflow:让 LLM 智能体自己跑完 C/C++ 模糊测试
jvm·c++·github·模糊测试·mcp·代码agent·智能体自动化
和裕18 小时前
年度框架直供 vs 零散按需采购:定制纸箱采购成本、交付与服务核心区别全对比
大数据·运维·网络·人工智能·算法
朝朝辞暮i18 小时前
C++ 第 13 课:值传递 —— 为什么函数里改了,外面却没变?
java·c++·算法
淡海水19 小时前
02-02-原理篇-分代GC
算法·unity·c#·游戏引擎·.net·gc
无忧.芙桃20 小时前
C++语言原理与实践(十):vector类的底层实现
开发语言·c++·算法
无名猿20 小时前
std::variant 完全指南:类型安全的 union 与 std::visit 用法
c++·stl·标准库·现代c++
乐迪信息20 小时前
AI防爆摄像机,监测港口船舶航行偏航隐患
大数据·人工智能·深度学习·算法·计算机视觉
无名猿20 小时前
C++ 迭代器五分类与失效场景汇总:一张表避开所有 UB
c++·stl·标准库·踩坑记录