Mod problem FZU
阿新 • • 發佈:2019-02-14
題意:定義了一種數值表示方式,給出這種表示方式下的表示,求原數值,模擬。
由於重複的次數都是個位數,最多也就是重複10000次,所以可以模擬這個重複的過程
輸出取模後的結果,那就每一步都取模就行了,重複之後會有一個和前面的值合併的問題
發現用棧更好實現這個過程
開始寫的時候感覺碼量會很大,動手寫會發現其實還好
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> #include<string> #include<stack> using namespace std; long long ten[2005]; long long mo; char ch[2005]; long long poww(long long a, long long x){ long long s = 1; while(x){ if(x & 1) s = s * a % mo; a = a * a % mo; x >>= 1; } return s; } int main(){ int T; cin >> T; while(T--){ scanf("%s", ch); int len = strlen(ch); cin >> mo; stack<pair<long long, long long> >ack; long long ans = 0, pre = 0; long long ln = 0; for(int i = 0; i < len; i++){ if(ch[i] == '['){ ack.push(make_pair(pre, ln)); pre = 0; ln = 0; } else if(ch[i] == ']'){ int x = ch[i + 1] - '0'; long long temp = pre; long long xx = poww(10, ln); ln = ln * x; x--; while(x--){ pre = (pre * xx + temp) % mo; } i++; pair<long long, long long> p = ack.top(); ack.pop(); pre = (pre + p.first * poww(10, ln)) % mo; ln = ln + p.second; } else{ pre = (pre * 10 + ch[i] - '0') % mo; ln++; } } cout << pre << endl; } return 0; }