zoukankan      html  css  js  c++  java
  • #113. 【UER #2】手机的生产

    链接:http://uoj.ac/problem/113

    由于电信技术的发展,人人都可以通过手机互相联系。
    
    有一位电信大佬最近想生产一大批手机,然而从生产线上一台一台地生产实在太慢了,于是他想出了一个办法 —— 让手机自我复制。
    
    于是他给手机加上了一个内置的函数 fork()。手机的程序如果调用这个函数,那么手机会生产出一台完全一模一样的手机(包括程序运行状态),并且自己这台的函数返回值为 11,新手机的函数返回值为 00,然后两台手机都继续执行程序。(请注意黑体字内容)
    
    初始时,只有一台手机。接着,大佬让手机计算形如这样的表达式:
    
    fork() <op> fork() <op> ... <op> fork()
    其中 <op> 是二元运算符,为 && 或者 || 中的一种。例如:
    
    fork() && fork() || fork() && fork() && fork() || fork()
    两个运算都是左结合的,且 && 的优先级比 || 高,所以上面的那个表达式相当于:
    
    ((fork() && fork()) || ((fork() && fork()) && fork())) || fork()
    对于表达式 a && b,手机会先计算 a 的值,如果为 00 那么不计算 b 的值(因为很重要所以说两遍,请注意这里不计算 b 的值),该表达式值为 00;否则计算 b 的值并将其值作为该表达式的值。
    
    对于表达式 a || b,手机会先计算 a 的值,如果为 11 那么不计算 b 的值(因为很重要所以说两遍,请注意这里不计算 b 的值),该表达式值为 11;否则计算 b 的值并将其值作为该表达式的值。
    
    表达式计算完成后,大佬制造出了数量惊人的手机,人类终于叩开了指数级工业制造的大门。
    
    一万万年后,一位考古学家调查了此次事件。他得到了大佬让手机计算的表达式。他想知道大佬当年究竟制造出了多少台手机。(包括初始的那台手机)
    
    你可以参照样例解释来更好地理解题意。
    
    输入格式
    第一行一个正整数 nn,表示表达式中的 fork() 的数量。
    
    接下来一行 n−1n−1 个用空格隔开的字符串,每个字符串为 “&&” 或者 “||”,依次表示表达式中对应位置的运算符。
    
    输出格式
    一行,一个整数表示制造出的手机的数量,你只用输出答案对 9982443539982443537×17×223+17×17×223+1,一个质数)取模后的结果。
    
    样例一
    input
    
    2
    &&
    
    output
    
    3
    
    explanation
    
    共生产 33 台手机,过程如下:
    
    第 11 台手机开始计算 fork() && fork()。
    第 11 台手机开始计算 fork(),产生了第 22 台手机。
    第 11 台和第 22 台的 fork() 计算完成,第 11 台返回 11,第 22 台返回 00。
    第 11 台手机由于 fork() 返回值为 11,开始计算 fork() && fork() 右边的 fork(),产生了第 33 台手机。
    第 22 台手机由于 fork() 返回值为 00,于是 fork() && fork() 值为 00(跳过右边的 fork 的计算),程序结束。
    第 11 台和第 33 台的 fork() 计算完成,第 11 台返回 11,第 33 台返回 00。
    第 11 台手机由于 fork() 返回值为 11,于是 fork() && fork() 值为 11,程序结束。
    第 33 台手机由于 fork() 返回值为 00,于是 fork() && fork() 值为 00,程序结束。
    样例二
    input
    
    6
    && || && && ||
    
    output
    
    15
    
    限制与约定
    测试点编号    nn的规模
    1    n=1n=1
    2    n≤5n≤5
    3
    4
    5    n≤100n≤100
    6
    7
    8    n≤100000n≤100000
    9
    10
    时间限制:1s1s
    空间限制:256MB
    题干

    先理解题意:

      给出一个逻辑运算式子(包括若干单元fork(),以及逻辑运算符)。

      由于优先级问题我们先把这个式子以“||”为界限分成若干组(在每一组内不同fork()之间用‘&&’ 连接)

      每运行一次fork()能在该位置产生另一部手机(注意它们不在同一条世界线上,产生后互不影响),新产生的手机在诞生位置的fork()上为一,(也就是说新产生的手机)进入下一组。

    再深入一些:

      每部手机只在当前组能复制,而它产生的手机进入下一组复制。(当然开始时只有一部手机,然后,慢慢增多)。

    #include<cstdlib>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    using namespace std;
    #define MOD  998244353
    queue<int>q;
    int n,tot1,tot0,f[100009],cnt;
    char a[100009],c,cc;
    int main()
    {
        scanf("%d",&n);
    //    scanf("%c",&c);
        for(int i=1;i<n;i++)
        {
            scanf("%c",&c);
            scanf("%c%c",&c,&cc);
            a[i]=c;
        }
    
        tot1=1;
        for(int i=1;i<n;i++)
        {
            if(a[i]=='&')    tot1++;
            else f[++cnt]=tot1,tot1=1;
        }
        f[++cnt]=tot1;
        long long ans1=1,ans0=f[1];
        for(int i=2;i<=cnt;i++)
        {
            ans1=(ans1+ans0)%MOD;
            ans0=(f[i]*ans0)%MOD;
        }
        cout<<(ans1+ans0)%MOD;
        return 0;
    }
    代码
  • 相关阅读:
    ios动态创建类Class
    iOS 视图控制器转场详解
    HTML5新增标签属性
    HTML5入门篇
    ExtJs 添加员工 实例 ---- 锚点布局 anchor 可自动伸缩
    Ext 初级UI设计
    Ext 面向对象程序设计 入门篇
    改善EF代码的方法(下)
    改善EF代码的方法(上)
    EF 存储过程(下)
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/7387817.html
Copyright © 2011-2022 走看看