暂无链接
锻造
题目背景
勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打,于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现……自己连一个史莱姆都打不过了。
勇者的精灵路由器告诉勇者其实是他自己的武器不好,并把他指引到了锻造厂。
题目描述
“欢迎啊,老朋友。”
一阵寒暄过后,厂长带他们参观了厂子四周,并给他们讲锻造的流程。
“我们这里的武器分成若干的等级,等级越高武器就越厉害,并且对每一等级的武器都有两种属性值
和
,但是我们初始只能花
个金币来生产
把
级剑……”
“所以你们厂子怎么这么垃圾啊,不能一下子就造出来
级的武器吗?”勇者不耐烦的打断了厂长的话。
“别着急,还没开始讲锻造呢……那我们举例你手中有一把
级武器和一把
级武器
,我们令锻造附加值
,则
你有
的概率将两把武器融合成一把
级的武器。”
“……但是,锻造不是一帆风顺的,你同样有
的概率将两把武器融合成一把
级的武器……”
勇者听完后暗暗思忖,他知道厂长一定又想借此机会坑骗他的零花钱,于是求助这个村最聪明的智者——你,来告诉他,想要强化出一把
级的武器,其期望花费为多少?
由于勇者不精通高精度小数,所以你只需要将答案对
,一个质数 ) 取模即可。
格式
输入格式
第一行两个整数
,含义如题所示。
为了避免输入量过大,第二行五个整数
,按照下列代码
来生成
和
数组。
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
数据范围
对于特殊性质处标示为“有”的数据满足
。
对于
的数据,
题解
乍一看以为 的时候成功率 ,感觉 分稳了,然而定睛一看:特么 怎么算???
还是只能老老实实推期望,先画个图:
设
为有了一把
级剑,要得到一把
级剑的期望花费,从
级升到
级的概率为
,根据上图,可以列出方程组如下:
解得 ,算出 。
现在我们有了
分,考虑如何递推下去,当我们融合一把
和
级的剑时,如果失败了,会得到一把
的剑,所以对于一次融合操作,失败时消耗的实际上是一把
级的剑,又因为我们的期望融合次数为
,最终可以得到锻造一把
级剑的期望花费的递推式:
最后 递推得到一组询问的解,完结撒花。
代码
#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();}