NC219001. Mocha的数据包
描述
输入描述
仅有一行,三个正整数 () 和 (,),表示 Mocha 需要发送数据包的数量,以及每个数据包发送成功概率的分子和分母。
输出描述
一个正整数,表示在最优策略下将所有数据包全部发送的期望代价对 取模的结果。
示例1
输入:
1 7 10
输出:
570425346
说明:
只有一个物品,每次发送花费代价为 ,容易得到期望代价为 。示例2
输入:
3 7 10
输出:
723843564
C++(clang++11) 解法, 执行用时: 303ms, 内存消耗: 23240K, 提交时间: 2021-05-10 00:58:41
#include<stdio.h> typedef long long ll; #define M 998244353 int i,j,k,n,m; ll c[2050][2050],sb,sb2,f[2050]={0,1},dp[2050]; ll ksm(ll a,ll p){ll res=1;while(p){if(p&1){res=res*a%M;}a=a*a%M;p>>=1;}return res;} int main(){ c[0][0]=1; scanf("%d%lld%lld",&n,&sb,&sb2); sb=sb*ksm(sb2,M-2)%M; sb2=(-sb+M+1)%M; for(i=2;i<=2000;i++){ f[i]=(f[i-1]+f[i-2])%M; } for(i=1;i<=n;i++){ dp[i]=f[n+1-i];c[i][0]=c[i][i]=1; for(j=1;j<i;j++){ c[i][j]=(c[i-1][j]+c[i-1][j-1])%M; dp[i]+=c[i][j]*ksm(sb2,j)%M*ksm(sb,i-j)%M*dp[j]%M; } dp[i]=dp[i]%M*ksm((M-ksm(sb2,i)%M+1)%M,M-2)%M; } printf("%lld",dp[n]); }