官方题解
2025-09-15 12:41:50
发布于:浙江
0阅读
0回复
0点赞
题目大意
两人从 号太空站出发,第 个太空站传送范围为 且等概率传送,求两人使用相同传送次数到达 号太空站的概率。
题目思路
通过概率DP思想求解。
设 表示传送了 次到达 号太空站的概率。
状态转移: ,其中 。如果直接这么转移时间复杂度是 。
但不难发现,转移实际上是一段连续的区间,所以我们可以通过差分前缀和优化。
最终答案为 。时间复杂度 。
参考代码
#include <bits/stdc++.h>
using namespace std;
const int N = 8010;
const int INF = 1e18+10;
const int mod = 998244353;
int a[N];
long long Inv[N];
long long dp[N][N];
long long fpow(long long a,long long x){
long long res=a%mod,ans=1;
while(x){
if(x&1) ans=ans*res%mod;
res=res*res%mod;
x >>= 1;
}
return ans;
}
long long inv(long long a){return fpow(a,mod-2);}
int main(){
int n;cin>>n;
for(int i=1;i<n;i++){
cin>>a[i];
Inv[a[i]]=inv(a[i]);
}
dp[0][1]=1;
for(int i=1;i<n;i++){
for(int j=1;j<n;j++){
int p=dp[i-1][j]*Inv[a[j]]%mod;
dp[i][j+1]=(dp[i][j+1]+p)%mod;
dp[i][j+a[j]+1]=(dp[i][j+a[j]+1]-p+mod)%mod;
}
for(int j=i+1;j<=n;j++){
dp[i][j]=(dp[i][j]+dp[i][j-1])%mod;
}
}
long long ans=0;
for(int i=1;i<=n;i++) ans=(ans+dp[i][n]*dp[i][n]%mod)%mod;
cout<<ans<<endl;
}
这里空空如也
有帮助,赞一个