锻造

这是一道数学题。
期望是一种很玄妙的东西。比如设一枚硬币抛到正面所需期望次数为x

可列方程x  =  x/2 + 1,解得x = 2

那么对于本题来说,开一个dp数组

如果我们需要一把等级为i的刀,那我们需要一把x - 1的刀和一把x - 2的刀

求出成功的期望,如果不成功就用得到的x - 2和另一把x - 1的刀再重新锻造

可得dp[ i ] = dp[ i - 1] + dp[ i - 2 ]

#include<cmath>
#include<cstdio>
#include<cctype>
#include<algorithm>
using namespace std;
typedef long long ll;
const int p=998244353;
const int N=1e7+5;
inline int read(){
    int X=0,w=0;char ch=0;
    while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
    while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
int inv[N],b[N],c[N],f[N];
inline int sub(int x,int y){
    x-=y;if(x<0)x+=p;return x;
}
int main(){
    freopen("forging.in","r",stdin);freopen("forging.out","w",stdout);
    inv[1]=1;
    for(int i=2;i<N;i++)inv[i]=(ll)(p-p/i)*inv[p%i]%p;
    
    int n=read();f[0]=read();
    int bx=read(),by=read(),cx=read(),cy=read(),mod=read();
    b[0]=by+1;c[0]=cy+1;
    for(int i=1;i<n;i++){
    b[i]=((ll)b[i-1]*bx+by)%mod+1;
    c[i]=((ll)c[i-1]*cx+cy)%mod+1;
    }
    f[1]=(ll)((ll)c[0]*inv[min(b[0],c[0])]%p+1)*f[0]%p;
    for(int i=2;i<=n;i++)
    f[i]=((ll)c[i-1]*inv[min(b[i-2],c[i-1])]%p*f[i-1]%p+f[i-2])%p;
    printf("%d
",f[n]);
    return 0;
}
原文地址:https://www.cnblogs.com/yupeiqi/p/9613705.html