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(logn)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;
}