zoukankan      html  css  js  c++  java
  • 【九校联考-24凉心模拟】锻造(forging)

    题目背景

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

    题目描述

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

    ****这是一个期望的题,首先呢举个抛硬币的例子,抛到正面的期望是二分之一x+1,这道题的是dp[i] = k * dp[i - 1]  + dp[i - 2],用i-1和i锻造,成功的期望求出来,如果失败了的话会有一个i-1的刀再和i-2的刀锻造出一个i的刀就好啦,然后接着锻造。。。

    *****说来实在惭愧,考试的时候真心没读懂样例。

     1 #include<cmath>
     2 #include<cstdio>
     3 #include<cctype>
     4 #include<algorithm>
     5 using namespace std;
     6 typedef long long ll;
     7 const int p=998244353;
     8 const int N=1e7+5;
     9 inline int read(){
    10     int X=0,w=0;char ch=0;
    11     while(!isdigit(ch))
    12     {
    13         w|=ch=='-';
    14         ch=getchar();
    15         }
    16     while(isdigit(ch))
    17     X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    18     return w?-X:X;
    19 }
    20 int inv[N],b[N],c[N],f[N];
    21 inline int sub(int x,int y){
    22     x-=y;if(x<0)x+=p;return x;
    23 }
    24 int main(){
    25     freopen("forging.in","r",stdin);
    26     freopen("forging.out","w",stdout);
    27     inv[1]=1;
    28     for(int i=2;i<N;i++)
    29     inv[i]=(ll)(p-p/i)*inv[p%i]%p;
    30     int n=read();
    31     f[0]=read();
    32     int bx=read(),by=read(),cx=read(),cy=read(),mod=read();
    33     b[0]=by+1;c[0]=cy+1;
    34     for(int i=1;i<n;i++)
    35     {
    36     b[i]=((ll)b[i-1]*bx+by)%mod+1;
    37     c[i]=((ll)c[i-1]*cx+cy)%mod+1;
    38     }
    39     f[1]=(ll)((ll)c[0]*inv[min(b[0],c[0])]%p+1)*f[0]%p;
    40     for(int i=2;i<=n;i++)
    41     f[i]=((ll)c[i-1]*inv[min(b[i-2],c[i-1])]%p*f[i-1]%p+f[i-2])%p;
    42     printf("%d
    ",f[n]);
    43     return 0;
    44 }
  • 相关阅读:
    元组,字典
    for循环补充,变量和不可变量,数字类型,字符串类型,列表类型
    流程控制之while循环,for循环
    运算符,流程控制之if判断
    变量,常量,基本数据类型、运算符
    蓝桥杯--算法提高 排列数 (简单dfs)
    蓝桥杯-- 历届试题 核桃的数量 (gcd)
    hdoj--1272--小希的迷宫(并查集)
    zzulioj--1769--去师院的旅程:能怎么走(三)(0.0)
    zzulioj--1638--Happy Thanksgiving Day
  • 原文地址:https://www.cnblogs.com/rax-/p/9613700.html
Copyright © 2011-2022 走看看