暂无链接
锻造
题目背景
勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打,于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现……自己连一个史莱姆都打不过了。
勇者的精灵路由器告诉勇者其实是他自己的武器不好,并把他指引到了锻造厂。
题目描述
“欢迎啊,老朋友。”
一阵寒暄过后,厂长带他们参观了厂子四周,并给他们讲锻造的流程。
“我们这里的武器分成若干的等级,等级越高武器就越厉害,并且对每一等级的武器都有两种属性值
b
b
b和
c
c
c,但是我们初始只能花
a
a
a个金币来生产
1
1
1把
0
0
0级剑……”
“所以你们厂子怎么这么垃圾啊,不能一下子就造出来
999
999
999级的武器吗?”勇者不耐烦的打断了厂长的话。
“别着急,还没开始讲锻造呢……那我们举例你手中有一把
x
x
x级武器和一把
y
y
y级武器
(
y
=
m
a
x
(
x
−
1
,
0
)
)
(y = max(x − 1, 0))
(y=max(x−1,0)),我们令锻造附加值
k
=
m
i
n
(
c
x
,
b
y
)
k = min(c_x, b_y)
k=min(cx,by),则
你有
k
c
x
\frac{k}{c_x}
cxk的概率将两把武器融合成一把
x
+
1
x + 1
x+1级的武器。”
“……但是,锻造不是一帆风顺的,你同样有
1
−
k
c
x
1 −\frac{k}{c_x}
1−cxk的概率将两把武器融合成一把
m
a
x
(
x
−
1
,
0
)
max(x − 1, 0)
max(x−1,0)级的武器……”
勇者听完后暗暗思忖,他知道厂长一定又想借此机会坑骗他的零花钱,于是求助这个村最聪明的智者——你,来告诉他,想要强化出一把
n
n
n级的武器,其期望花费为多少?
由于勇者不精通高精度小数,所以你只需要将答案对
998244353
(
7
×
17
×
2
23
+
1
998244353(7 ×17 × 2^{23} + 1
998244353(7×17×223+1,一个质数 ) 取模即可。
格式
输入格式
第一行两个整数
n
,
a
n, a
n,a,含义如题所示。
为了避免输入量过大,第二行五个整数
b
x
,
b
y
,
c
x
,
c
y
,
p
b_x, b_y, c_x, c_y, p
bx,by,cx,cy,p,按照下列代码
来生成
b
b
b和
c
c
c数组。
b[0]=by+1;c[0]=cy+1;
for(int i=1;i<n;i++){
b[i]=((long long)b[i-1]*bx+by)%p+1;
c[i]=((long long)c[i-1]*cx+cy)%p+1;
}
输出格式
输出一行一个整数,表示期望花费。
样例
样例 1 输入
0 6432
4602677 3944535 2618884 6368297 9477531
样例 1 输出
6432
样例 2 输入
1 3639650
6136976 5520115 2835750 9072363 9302097
样例 2 输出
150643649
样例 3 输入
10 2
2 33 6 66 2333333
样例 3 输出
976750710
3
样例 4 输入
200 5708788
0 0 0 0 1
样例 4 输出
696441597
数据范围
对于特殊性质处标示为“有”的数据满足
p
=
1
p = 1
p=1。
对于
100
%
100\%
100%的数据,
0
≤
a
≤
1
0
7
,
0
≤
b
x
,
b
y
,
c
x
,
c
y
<
p
<
1
0
7
,
0
≤
n
≤
1
0
7
0 ≤ a ≤ 10^7, 0 ≤ b_x, b_y, c_x, c_y < p < 10^7, 0 ≤ n ≤10^7
0≤a≤107,0≤bx,by,cx,cy<p<107,0≤n≤107
题解
乍一看以为 p = 1 p=1 p=1的时候成功率 100 % 100\% 100%,感觉 60 60 60分稳了,然而定睛一看:特么 d p [ 1 ] dp[1] dp[1]怎么算???
还是只能老老实实推期望,先画个图:
设
f
[
i
]
f[i]
f[i]为有了一把
i
i
i级剑,要得到一把
1
1
1级剑的期望花费,从
0
0
0级升到
1
1
1级的概率为
p
p
p,根据上图,可以列出方程组如下:
{
f
[
1
]
=
0
f
[
0
]
=
(
1
−
p
)
×
f
[
0
]
+
p
×
f
[
1
]
\left\{ \begin{aligned} &f[1]=0\\ &f[0]=(1-p)\times f[0]+p\times f[1] \end{aligned} \right.
{f[1]=0f[0]=(1−p)×f[0]+p×f[1]
解得 f [ 0 ] = a × 1 − p p f[0]=a\times \frac{1-p}{p} f[0]=a×p1−p,算出 d p [ 1 ] = f [ 0 ] + a = a p dp[1]=f[0]+a=\frac{a}{p} dp[1]=f[0]+a=pa。
现在我们有了
60
60
60分,考虑如何递推下去,当我们融合一把
i
−
1
i-1
i−1和
i
−
2
i-2
i−2级的剑时,如果失败了,会得到一把
i
−
2
i-2
i−2的剑,所以对于一次融合操作,失败时消耗的实际上是一把
i
−
1
i-1
i−1级的剑,又因为我们的期望融合次数为
1
p
\frac{1}{p}
p1,最终可以得到锻造一把
i
i
i级剑的期望花费的递推式:
d
p
[
i
]
=
d
p
[
i
−
1
]
×
1
p
+
d
p
[
i
−
2
]
dp[i]=dp[i-1]\times \frac{1}{p}+dp[i-2]
dp[i]=dp[i−1]×p1+dp[i−2]
最后 O ( n ) O(n) O(n)递推得到一组询问的解,完结撒花。
代码
#include<cstdio>
#define min(a,b) (a<b?a:b)
const int M=1e7+5,mod=998244353;
int dp[M],b[M],c[M],inv[M],n,a,bx,by,cx,cy,p,i;
void in(){scanf("%d%d%d%d%d%d%d",&n,&a,&bx,&by,&cx,&cy,&p);}
void ac()
{
for(inv[1]=1,i=2;i<=1e7;++i)inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
for(b[0]=by+1,c[0]=cy+1,i=1;i<=n;++i)b[i]=(1ll*b[i-1]*bx+by)%p+1,c[i]=(1ll*c[i-1]*cx+cy)%p+1;
for(dp[0]=a,dp[1]=(a+1ll*a*inv[min(b[0],c[0])]%mod*c[0]%mod)%mod,i=2;i<=n;++i)dp[i]=(1ll*dp[i-1]*inv[min(c[i-1],b[i-2])]%mod*c[i-1]%mod+dp[i-2])%mod;
printf("%d",dp[n]);
}
int main(){in(),ac();}