专栏文章
题解:B4337 [中山市赛 2023] 简单数学题
B4337题解参与者 7已保存评论 8
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @mip3n0sv
- 此快照首次捕获于
- 2025/12/03 05:37 3 个月前
- 此快照最后确认于
- 2025/12/03 05:37 3 个月前
首先,从第一个盒子里抽出白球的概率可以转化为从第一个盒子里白球的期望个数在除以第一个盒子的总球数。
我们知道在每一轮操作之后两个盒子的球数是不会变化的,于是设一些变量,令 为第一个盒子的总球数,令 为第二个盒子的总球数, 为白球总数。即:
我们设 为经过 轮操作后第一个盒子里白球的期望个数,则 。在每次操作中,第一个盒子中白球的期望个数是上一轮留下的,加上从第二个盒子中取出来的,因此我们有以下递推式:
化简得:
为了方便,我们令 ,令 。
由于 和 均为常数,所以可以提前预处理出来他们的值,就得到了 的算法,可以获得 的高分。可以看出这是一个形如 的递推式,我们可以写几个找找规律:
这里我们可以将 提出来,即 ,根据等比数列公式可以写成 ,那么答案即为 ,时间复杂度为 ,可以通过。
AC代码:
CPP#include<bits/stdc++.h>
#define db double
#define rg register
#define pb push_back
#define pob pop_back
#define pii pair<int,int>
#define vi vector<int>
#define fr first
#define sc second
#define endl '\n'
#define int long long
using namespace std;
const int inf=0x3f3f3f3f;
const int mod=998244353;
int read() {
int f=1,x=0;
char c=getchar();
while(!isdigit(c)) {
if(c=='-') f=-1;
c=getchar();
}while(isdigit(c)) {
x=(x<<1)+(x<<3)+(c-'0');
c=getchar();
}return x*f;
}
int n,a1,a2,b1,b2;
int A,B,T,now,p,q;
int qpow(int x,int a) {
int res=1;
while(a) {
if(a&1) res*=x,res%=mod;
x*=x,x%=mod,a>>=1;
} return res;
}
signed main() {
n=read(),a1=read()%mod,a2=read()%mod,b1=read()%mod,b2=read()%mod;
A=(a1+a2)%mod,B=(b1+b2)%mod,T=(a1+b1)%mod;
p=(A-1)*B%mod*qpow(A,mod-2)%mod*qpow(B+1,mod-2)%mod,q=T*qpow(B+1,mod-2)%mod;
now=a1;
now=qpow(p,n)*a1%mod;
now+=(qpow(p,n)-1+mod)*q%mod*qpow(p-1,mod-2)%mod;
cout<<now*qpow(A,mod-2)%mod<<"\n";
return 0;
}
相关推荐
评论
共 8 条评论,欢迎与作者交流。
正在加载评论...