这是一道数学题。
期望是一种很玄妙的东西。比如设一枚硬币抛到正面所需期望次数为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;
}