洛谷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 天前
区块链从小白到精通(七):Solidity 语法精讲——数据类型、函数、修饰器与事件
算法·区块链·php·智能合约·哈希算法
旖旎夜光1 天前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
ShineWinsu1 天前
对于Qt:QTabWidget常见属性的解析
开发语言·数据库·c++·qt·浏览器·qtabwidget·标签页
Pniubi1 天前
力扣24. 两两交换链表中的节点(递归)
算法·leetcode·链表
꧁细听勿语情꧂1 天前
直接选择排序,堆排序,冒泡排序,递归快速排序、hoare版本、挖坑法、lomuto前后指针,非递归快速排序
c语言·开发语言·数据结构·算法
俊俊几年的1 天前
动态规划(Dynamic Programming)详解:从入门到 LeetCode Hot 100
linux·c++·算法·leetcode·嵌入式·动态规划·c
小雉系统1 天前
BcoreOS安全通信架构:FsSession 抗算法后门安全设计
算法·安全·架构
唐墨1232 天前
linux kernel 比较数据大小的宏定义
linux·算法
拂拉氏2 天前
【知识讲解-题目讲解】 统计满足K约束的子字符串数量2 (滑动窗口+前缀和+二分查找+分析)
算法·前缀和·二分查找·滑动窗口