#113. 【UER #2】手機的生產

來源:互聯網
上載者:User

標籤:lan   答案   代碼   多少   運算式計算   for   輸出   char   clu   

連結: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 個用空格隔開的字串,每個字串為 “&&” 或者 “||”,依次表示運算式中對應位置的運算子。輸出格式一行,一個整數表示製造出的手機的數量,你只用輸出答案對 998244353998244353(7×17×223+17×17×223+1,一個質數)模數後的結果。範例一input2&&output3explanation共生產 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,程式結束。範例二input6&& || && && ||output15限制與約定測試點編號    nn的規模1    n=1n=12    n≤5n≤5345    n≤100n≤100678    n≤100000n≤100000910時間限制: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  998244353queue<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;}
代碼

 

#113. 【UER #2】手機的生產

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.