[2018.10.11 T1] 锻造

暂无链接

锻造

题目背景

勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打,于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现……自己连一个史莱姆都打不过了。
勇者的精灵路由器告诉勇者其实是他自己的武器不好,并把他指引到了锻造厂。

题目描述

“欢迎啊,老朋友。”
一阵寒暄过后,厂长带他们参观了厂子四周,并给他们讲锻造的流程。
“我们这里的武器分成若干的等级,等级越高武器就越厉害,并且对每一等级的武器都有两种属性值 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(x1,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} 1cxk的概率将两把武器融合成一把 m a x ( x − 1 , 0 ) max(x − 1, 0) max(x1,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 &lt; p &lt; 1 0 7 , 0 ≤ n ≤ 1 0 7 0 ≤ a ≤ 10^7, 0 ≤ b_x, b_y, c_x, c_y &lt; p &lt; 10^7, 0 ≤ n ≤10^7 0a107,0bx,by,cx,cy<p<107,0n107

题解

乍一看以为 p = 1 p=1 p=1的时候成功率 100 % 100\% 100%,感觉 60 60 60分稳了,然而定睛一看:特么 d p [ 1 ] dp[1] dp[1]怎么算???

还是只能老老实实推期望,先画个图:
1.png

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} &amp;f[1]=0\\ &amp;f[0]=(1-p)\times f[0]+p\times f[1] \end{aligned} \right. {f[1]=0f[0]=(1p)×f[0]+p×f[1]

解得 f [ 0 ] = a × 1 − p p f[0]=a\times \frac{1-p}{p} f[0]=a×p1p,算出 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 i1 i − 2 i-2 i2级的剑时,如果失败了,会得到一把 i − 2 i-2 i2的剑,所以对于一次融合操作,失败时消耗的实际上是一把 i − 1 i-1 i1级的剑,又因为我们的期望融合次数为 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[i1]×p1+dp[i2]

最后 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();}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShadyPi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值