1. 程式人生 > 其它 >abc--280--E

abc--280--E

題目大意

一個人有n條命,你有p%的概率一次打它兩條命,有(100-p)%的概率一次打他一條命
求你打死它需要的次數的期望值

思路

其實也就和走臺階的那個題目是一樣的,用dp寫就行了
每一次只會打一點血或者兩點血,也就上從上面兩個狀態進行轉移就可以了

f[i] = f[i-2]*p/100 + f[i-1]*(100-p)/100

只需要對這個值進行求逆元就可以了

程式碼
#include <bits/stdc++.h>
using namespace std;
const int M=2e5+5;
#define int long long
const int mod=998244353;

inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}

int kpow(int a,int b) {
    int ans=1;
    while(b) {
        if(b&1)ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}

int f[M];

signed main() {
    int n=read(),p=read();
    f[0]=0;
    f[1]=1;
    //從哪裡轉移過來的概率
    for(int i=2;i<=n;i++)
        f[i]=(1+(f[i-2]*p+f[i-1]*(100-p))%mod*kpow(100,mod-2)%mod)%mod;
    cout<<f[n];
    return 0;
}