【九校联考】锻造

题目描述

“欢迎啊,老朋友。”

一阵寒暄过后,厂长带他们参观了厂子四周,并给他们讲锻造的流程。

“我们这里的武器分成若干的等级,等级越高武器就越厉害,并且对每一等级的武器都有两种属性值 b 和 c,但是我们初始只能花 a 个金币来生产 1 把 0 级剑……”

“所以你们厂子怎么这么垃圾啊,不能一下子就造出来 999 级的武器吗?”勇者不耐烦的打断了厂长的话。

“别着急,还没开始讲锻造呢……那我们举例你手中有一把 x 级武器和一把 y 级武器 (y = max(x?1,0)),我们令锻造附加值 k = min(c x ,b y ),则你有 k/cx 的概率将两把武器融合成一把 x + 1 级的武器。”

“……但是,锻造不是一帆风顺的,你同样有 1 ? k/cx 的概率将两把武器融合成一把 max(x ? 1,0) 级的武器……”

勇者听完后暗暗思忖,他知道厂长一定又想借此机会坑骗他的零花钱,于是求助这个村最聪明的智者——你,来告诉他,想要强化出一把 n 级的武器,其期望花费为多少?

由于勇者不精通高精度小数,所以你只需要将答案对 998244353(7 ×17 × 2 23 + 1,一个质数 ) 取模即可。

输入

第一行两个整数 n,a,含义如题所示。

为了避免输入量过大,第二行五个整数 bx,by,cx,cy,p,按照下列代码来生成 b 和 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;
}

输出

输出一行一个整数,表示期望花费。

样例输入

0 6432
4602677 3944535 2618884 6368297 9477531

样例输出

6432



题解

成功的概率p1=k / c[ i-1 ],失败的概率p2= ( c[ i-1 ] - k ) / c[ i-1 ]。设dp[ i ]表示升到 i 级的期望花费 ,那么dp[ i ] = p1 * ( dp[ i-1 ] + dp[ i-2 ] ) + p2* ( dp[ i-1 ] + dp[ i ] )。移项化简:

dp[ i ] = dp[ i-1 ]+ dp[ i-2 ] + ( c[ i-1 ] - k ) * dp[ i-1 ] / k 。预处理k的逆元,递推一遍即可。

#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long

const int maxn=1e7+50;
const int mod=998244353;

int n,a,bx,by,cx,cy,p,k,inv[maxn];
int b[maxn],c[maxn];
ll dp[maxn];

template<typename T>void read(T& aa){
    char cc; ll ff;aa=0;cc=getchar();ff=1;
    while((cc<‘0‘||cc>‘9‘)&&cc!=‘-‘) cc=getchar();
    if(cc==‘-‘) ff=-1,cc=getchar();
    while(cc>=‘0‘&&cc<=‘9‘) aa=aa*10+cc-‘0‘,cc=getchar();
    aa*=ff;
}

ll qpow(ll a,ll b){
    ll ans=1;a%=mod;
    for(ll i=b;i;i>>=1,a=a*a%mod)
    if(i&1) ans=ans*a%mod;
    return ans;
}

void init(){
    inv[1]=1;
    for(int i=2;i<=maxn;i++)
    inv[i]=(ll)inv[mod%i]*(mod-mod/i)%mod;
}

int main(){
    freopen("forging.in","r",stdin);
    freopen("forging.out","w",stdout);
    read(n),read(a);
    read(bx),read(by),read(cx),read(cy),read(p);
    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;
    }
    init();
    dp[0]=a;
    k=min(c[0],b[0]);
    dp[1]=(2ll*k*a%mod+1ll*a*(c[0]-k+mod)%mod)%mod*inv[k]%mod;
    for(int i=2;i<=n;i++){
        k=min(c[i-1],b[i-2]);
        dp[i]=((dp[i-1]+dp[i-2])%mod+1ll*dp[i-1]*(c[i-1]-k+mod)%mod*inv[k]%mod)%mod;
    }
    cout<<dp[n]<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/rlddd/p/9814336.html

时间: 2024-10-12 19:27:58

【九校联考】锻造的相关文章

九校联考 终&amp;启

one term's ending... class:12 school:130...130...130... 至今没有看到九校的排名,如果九校排名正常的话,那yyhs的学生也太可怕了...估计要三百开外了 语文是比较意外的分数,尽管选择题做得差,可是有史以来第一次下110....why 数学和英语都比预估的低. 政史地84 65 78,感觉最对不起历史老师...地理从来没好过. 物化技82 75 83,是时候改课了..... 明明下半学期一直在学文化课...现在连浙大线都考不上了.... 学考

10.02 T3 打表找递推式+十进制快速幂 九校联考凉心模拟DAY1T1

题目背景 金企鹅同学非常擅长用1*2的多米诺骨牌覆盖棋盘的题.有一天,正 在背四六级单词的他忽然想:既然两个格子的积木叫“多米诺(domino)”,那 么三个格子的的积木一定叫“三米诺(tromino)”了!用三米诺覆盖棋盘的题 怎么做呢? 题目描述 用三米诺覆盖3n 的矩形棋盘,共多少种方案?三米诺可旋转:两种 方案不同当且仅当这两种图案直接覆盖在一起无法重叠. 输入输出格式 输入格式: 一行一个整数n(n<=10^40000),表示棋盘列数. 输出格式: 一行一个整数,表示方案数,对9982

10.29 FJ四校联考

//四校联考Rank 16 感觉很滋磁 (虽然考的时候抱怨厦门一中出的数学题很NOIP///) 圈地 [问题描述] n根长度不一定相同的木棍,至多可以对其中一根切一刀,然后用其中的任意根围一个三角形,求三角形的最大面积.设面积为S,输出16*S^2对998244353取模后的答案.特别地,无解输出-1. 注:退化的三角形(面积为零)不被认为是三角形,答案应该为-1. [输入文件] 输入文件为tri.in. 输入文件第一行包含两个正整数n和998244353. 第二行包含n个正整数,表示每根木棍的

【BZOJ5248】【九省联考2018】一双木棋(搜索,哈希)

[BZOJ5248][九省联考2018]一双木棋(搜索,哈希) 题面 BZOJ Description 菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手.棋局开始时,棋盘上没有任何棋子, 两人轮流在格子上落子,直到填满棋盘时结束.落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且 这个格子的左侧及上方的所有格子内都有棋子. 棋盘的每个格子上,都写有两个非负整数,从上到下第i行中从左到右第j列的格子上的两个整数记作Aij.Bij.在 游戏结束后,菲菲和牛牛会分别计算自己

九省联考 2018 游记

Day0:乘火车到了上海.明天就是激动人心的比赛啦 深夜和室友看<我在七年后等你>.这真是一款不错的手游,让人印象深刻啊 Day1:迷迷糊糊到了学校.编程环境是Win7?不太习惯啊. T1:一眼状压dp题. T2:肯定可以建成一棵树,然后直接贪心?不对啊,T2不应该这么水啊(开始怀疑) T3:乍一看怎么一点思路没有啊. 8:40~11:10:持续思考T3中. 11:10:终于有思路了!如果直接NTT向上dp的话,因为链的情况复杂度会不对,所以似乎可以树剖!用线段树分治和NTT处理重链上的dp!

[luogu] P4364 [九省联考2018]IIIDX(贪心)

P4364 [九省联考2018]IIIDX 题目背景 Osu 听过没?那是Konano 最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏.现在,他在世界知名游戏公司KONMAI 内工作,离他的梦想也越来越近了. 这款音乐游戏内一般都包含了许多歌曲,歌曲越多,玩家越不易玩腻.同时,为了使玩家在游戏上氪更多的金钱花更多的时间,游戏一开始一般都不会将所有曲目公开,有些曲目你需要通关某首特定歌曲才会解锁,而且越晚解锁的曲目难度越高. 题目描述 这一天,Konano 接到了一个任务

多校联考九场总结

总算考完了九套试题,天天早上坐五个小时,下午都会头痛的要死QAQ 不过考的貌似不错? 九场平均分 215.78 数一数考场上没有1A的题目吧(不算有毒的OJ卡我常数): 1.超立方体 QAQ 当时并不会FWT,矩阵乘法搞出系数来之后只能暴力贡献 然后输入的时候没有直接取模爆了long long,于是暴力也被炸飞了 后来学了FWT发现是水题 2.IP地址 没有使用合适的转化询问的方式 使得这道题目可以用打标记的方式来做 转化的一些经典方式:差分,叶节点查询转化为链求和,区间可减性查询转化为前缀查询

八校联考第一场(20170917)

排列(permutation)题目描述]给定一个n*n 的矩阵f,你需要求出有多少个1~n 的排列x 满足对于1<=i≠j<=n,均有f[i,j]=min(x[i],x[j]),并输出字典序最小的一个.有多组数据.[输入数据]第一行一个整数t 表示数据组数.每组数据第一行一个正整数n.接下来n 行每行n 个整数,第i行第j 列的整数表示f[i,j].[输出数据]对于每组数据,如果不存在这样的排列,输出一行一个整数-1.否则输出两行,第一行一个整数表示排列个数对998244353 取模的结果,第

20181009noip HZ EZ两校联考sum(莫队,组合数学)

题面戳这里 思路: noip考莫队???!!! 考场上死活没往这方面想啊!!!数据分治忘写endl50pts滚粗了 这里每个询问都有n,m两个参数 我们可以把它看做常规莫队中的l和r 然后利用组合数的可递推性质就好了 相信改变m大家都会写,n呢? 看图: 我们发现,$S_n^m = S_{n-1}^m \times 2 - C_n^{m+1} + C_{n-1}^{m+1}$ (因为杨辉三角的性质) 所以n也可以递推 套个莫队就好了 代码: #include<iostream> #includ