標籤: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】手機的生產