暂无链接
锻造
题目背景
勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打,于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现……自己连一个史莱姆都打不过了。
勇者的精灵路由器告诉勇者其实是他自己的武器不好,并把他指引到了锻造厂。
题目描述
“欢迎啊,老朋友。”
一阵寒暄过后,厂长带他们参观了厂子四周,并给他们讲锻造的流程。
“我们这里的武器分成若干的等级,等级越高武器就越厉害,并且对每一等级的武器都有两种属性值bbb和ccc,但是我们初始只能花aaa个金币来生产111把000级剑……”
“所以你们厂子怎么这么垃圾啊,不能一下子就造出来999999999级的武器吗?”勇者不耐烦的打断了厂长的话。
“别着急,还没开始讲锻造呢……那我们举例你手中有一把xxx级武器和一把yyy级武器(y=max(x−1,0))(y = max(x − 1, 0))(y=max(x−1,0)),我们令锻造附加值k=min(cx,by)k = min(c_x, b_y)k=min(cx,by),则
你有kcx\frac{k}{c_x}cxk的概率将两把武器融合成一把x+1x + 1x+1级的武器。”
“……但是,锻造不是一帆风顺的,你同样有1−kcx1 −\frac{k}{c_x}1−cxk的概率将两把武器融合成一把max(x−1,0)max(x − 1, 0)max(x−1,0)级的武器……”
勇者听完后暗暗思忖,他知道厂长一定又想借此机会坑骗他的零花钱,于是求助这个村最聪明的智者——你,来告诉他,想要强化出一把nnn级的武器,其期望花费为多少?
由于勇者不精通高精度小数,所以你只需要将答案对998244353(7×17×223+1998244353(7 ×17 × 2^{23} + 1998244353(7×17×223+1,一个质数 ) 取模即可。
格式
输入格式
第一行两个整数n,an, an,a,含义如题所示。
为了避免输入量过大,第二行五个整数bx,by,cx,cy,pb_x, b_y, c_x, c_y, pbx,by,cx,cy,p,按照下列代码
来生成bbb和ccc数组。
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=1p = 1p=1。
对于100%100\%100%的数据,0≤a≤107,0≤bx,by,cx,cy<p<107,0≤n≤1070 ≤ a ≤ 10^7, 0 ≤ b_x, b_y, c_x, c_y < p < 10^7, 0 ≤ n ≤10^70≤a≤107,0≤bx,by,cx,cy<p<107,0≤n≤107
题解
乍一看以为p=1p=1p=1的时候成功率100%100\%100%,感觉606060分稳了,然而定睛一看:特么dp[1]dp[1]dp[1]怎么算???
还是只能老老实实推期望,先画个图:
设f[i]f[i]f[i]为有了一把iii级剑,要得到一把111级剑的期望花费,从000级升到111级的概率为ppp,根据上图,可以列出方程组如下:
{f[1]=0f[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−ppf[0]=a\times \frac{1-p}{p}f[0]=a×p1−p,算出dp[1]=f[0]+a=apdp[1]=f[0]+a=\frac{a}{p}dp[1]=f[0]+a=pa。
现在我们有了606060分,考虑如何递推下去,当我们融合一把i−1i-1i−1和i−2i-2i−2级的剑时,如果失败了,会得到一把i−2i-2i−2的剑,所以对于一次融合操作,失败时消耗的实际上是一把i−1i-1i−1级的剑,又因为我们的期望融合次数为1p\frac{1}{p}p1,最终可以得到锻造一把iii级剑的期望花费的递推式:
dp[i]=dp[i−1]×1p+dp[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();}