
吐槽:
考试的时候一直推的是f(k-1)*p,就导致gg了
分析:
假设现在已经k-1个正面向上了,
首先f(k)=f(k-1)+1+(....),表示起码从k-1转移到k还需1次
后面加的就是分别讨论两种情况
如果这次硬币正面向上,则还需要抛0次 p*0
如果这次硬币反面向上,则空亏一窥 还需要(1-p)*f(k)
则式子就是
f(k)=f(k-1)+1+p×0+f(k)×(1-p)
=f(k-1)+1+f(k)*(1-p)
最后化简为一个等比数列求和
注意:还要特判1这种情况
code:
#include <cstdio> #define ri register int typedef long long ll; #define rll register ll const int mod=998244353; inline int fpow(ri a,rll b){ ri ans=1; for(;b;b>>=1,a=(ll)a*a%mod) if(b&1) ans=(ll)ans*a%mod; return ans; } int main(){ freopen("coin.in","r",stdin); freopen("coin.out","w",stdout); ri p; rll k; scanf("%d%lld",&p,&k); if(p==1) printf("%lld\n",k); else p=fpow(p,mod-2), printf("%lld\n",(ll)p*(fpow(p,k)-1+mod)%mod*fpow(p-1,mod-2)%mod); return 0; }