• 九校联考-DL24凉心模拟Day2T1 锻造(forging)


    1.1 题目背景

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

    1.2题目描述

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

    1.3 格式

    1.3.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;
    }
    

    1.3.2 输出格式

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

    1.4 样例

    1.4.1 样例 1 输入

    0 6432
    4602677 3944535 2618884 6368297 9477531

    1.4.2 样例 1 输出

    6432

    1.4.3 样例 2 输入

    1 3639650
    6136976 5520115 2835750 9072363 9302097

    1.4.4 样例 2 输出

    150643649

    1.4.5 样例 3 输入

    10 2
    2 33 6 66 2333333

    1.4.6 样例 3 输出

    976750710

    1.4.7 样例 4 输入

    200 5708788
    0 0 0 0 1

    1.4.8 样例 4 输出

    696441597

    1.5数据范围

    测试点 n<= 特殊性质
    1 0 n/a
    2 1 n/a
    3 200
    4 200 n/a
    5 2000
    6 2000 a/n
    7 (10^6)
    8 (10^6) n/a
    9 (10^7)
    10 (10^7) n/a

    对于特殊性质处标示为“有”的数据满足 p = 1。
    对于 100% 的数据,0 ≤ a ≤ (10^7) , 0 ≤ bx, by, cx, cy < p < (10^7) , 0 ≤ n ≤(10^7)

    啥?期望?不会下一题
    (回来之后
    p1好像可以瞎搞搞过去...
    好像b和c数组全是1??
    好像是fib??
    40分到手
    n
    0好像就是a??
    又10分
    数据范围好像有点大???
    long long不够开??
    啊少10分
    (全场5-6人全开long long 的得到了0分的好成绩emm...
    事后出题人:啥?256M还过不了??long long ?? int 就行了啊

    正解:
    期望dp+线性逆元
    前置问题: 抛一枚硬币,抛到正面停止,否则继续抛,问期望抛多少次?

    [x=1+frac{x}{2} ]

    同理(不知道哪来的理请去重学期望)可以最终得到

    [f[i] = c[i - 1] * inv[min(c[i - 1], b[i - 2])]*f[i - 1] + f[i - 2] 前面O(n)预处理一下逆元就好啦 这位~~卡空间的毒瘤?~~出题人在最后写道:这应该是一道全场A穿题 ```cpp #include<cmath> #include<cstdio> #include<cctype> #include<algorithm> using namespace std; typedef long long ll; const int p=998244353; const int N=1e7+5; inline int read(){ int X=0,w=0;char ch=0; while(!isdigit(ch)){w|=ch=='-';ch=getchar();} while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar(); return w?-X:X; } int inv[N],b[N],c[N],f[N]; inline int sub(int x,int y){ x-=y;if(x<0)x+=p;return x; } int main(){ freopen("forging.in","r",stdin);freopen("forging.out","w",stdout); inv[1]=1; for(int i=2;i<N;i++)inv[i]=(ll)(p-p/i)*inv[p%i]%p; int n=read();f[0]=read(); int bx=read(),by=read(),cx=read(),cy=read(),mod=read(); b[0]=by+1;c[0]=cy+1; for(int i=1;i<n;i++){ b[i]=((ll)b[i-1]*bx+by)%mod+1; c[i]=((ll)c[i-1]*cx+cy)%mod+1; } f[1]=(ll)((ll)c[0]*inv[min(b[0],c[0])]%p+1)*f[0]%p; for(int i=2;i<=n;i++) f[i]=((ll)c[i-1]*inv[min(b[i-2],c[i-1])]%p*f[i-1]%p+f[i-2])%p; printf("%d ",f[n]); return 0; } ```]

  • 相关阅读:
    Windows7发生VS2005无法调试Web项目《转》
    压缩SQL Server 2005指定数据库文件和日志
    .net开源工具Zed
    oracle 开发手册
    sql server 日期函数第一天
    相对应的汉语拼音首字母串<收藏>
    oracle 触发器使用《收藏》
    Oracle三种集合数据类型的比较
    sql server 系统表
    chart
  • 原文地址:https://www.cnblogs.com/shulker/p/9615039.html
Copyright © 2020-2023  润新知