[2018.10.11 T1] 锻造

版权声明:大佬您能赏脸,蒟蒻倍感荣幸,还请联系我让我好好膜拜。 https://blog.csdn.net/ShadyPi/article/details/83035420

暂无链接

锻造

题目背景

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

题目描述

“欢迎啊,老朋友。”
一阵寒暄过后,厂长带他们参观了厂子四周,并给他们讲锻造的流程。
“我们这里的武器分成若干的等级,等级越高武器就越厉害,并且对每一等级的武器都有两种属性值 b b c c ,但是我们初始只能花 a a 个金币来生产 1 1 0 0 级剑……”
“所以你们厂子怎么这么垃圾啊,不能一下子就造出来 999 999 级的武器吗?”勇者不耐烦的打断了厂长的话。
“别着急,还没开始讲锻造呢……那我们举例你手中有一把 x x 级武器和一把 y y 级武器 ( y = m a x ( x 1 , 0 ) ) (y = max(x − 1, 0)) ,我们令锻造附加值 k = m i n ( c x , b y ) k = min(c_x, b_y) ,则
你有 k c x \frac{k}{c_x} 的概率将两把武器融合成一把 x + 1 x + 1 级的武器。”
“……但是,锻造不是一帆风顺的,你同样有 1 k c x 1 −\frac{k}{c_x} 的概率将两把武器融合成一把 m a x ( x 1 , 0 ) max(x − 1, 0) 级的武器……”
勇者听完后暗暗思忖,他知道厂长一定又想借此机会坑骗他的零花钱,于是求助这个村最聪明的智者——你,来告诉他,想要强化出一把 n n 级的武器,其期望花费为多少?
由于勇者不精通高精度小数,所以你只需要将答案对 998244353 ( 7 × 17 × 2 23 + 1 998244353(7 ×17 × 2^{23} + 1 ,一个质数 ) 取模即可。

格式
输入格式

第一行两个整数 n , a n, a ,含义如题所示。
为了避免输入量过大,第二行五个整数 b x , b y , c x , c y , p b_x, b_y, c_x, c_y, p ,按照下列代码
来生成 b b 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
对于 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

题解

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

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

f [ i ] f[i] 为有了一把 i i 级剑,要得到一把 1 1 级剑的期望花费,从 0 0 级升到 1 1 级的概率为 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 [ 0 ] = a × 1 p p f[0]=a\times \frac{1-p}{p} ,算出 d p [ 1 ] = f [ 0 ] + a = a p dp[1]=f[0]+a=\frac{a}{p}

现在我们有了 60 60 分,考虑如何递推下去,当我们融合一把 i 1 i-1 i 2 i-2 级的剑时,如果失败了,会得到一把 i 2 i-2 的剑,所以对于一次融合操作,失败时消耗的实际上是一把 i 1 i-1 级的剑,又因为我们的期望融合次数为 1 p \frac{1}{p} ,最终可以得到锻造一把 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]

最后 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();}

猜你喜欢

转载自blog.csdn.net/ShadyPi/article/details/83035420
t1
今日推荐