Instruction DecoderProblem code: ICODER |
Mathews uses a brand new 16-bit instruction processor. (Yeah i am being sarcastic!). It has one register (say R) and it supports two instructions:
- ADD X; Impact: R = (R + X) mod 65536
- MUL X; Impact: R = (R * X) mod 65536
- [For both instructions 0 <= X <= 65535]
Input Format:
The input file consists of multiple testcases.
The first line of each testcase contains one integer, N. (1 <= N <= 100,000).
The following N lines contain one instructions each.
Input terminates with a line containing N=0, which must not be processed.
Output Format:
For each testcase print one integer in a single line, denoting the number of different values the register can take after code execution.
Sample Input:
1 ADD 3 1 MUL 0 5 MUL 3 ADD 4 MUL 5 ADD 3 MUL 2 8 ADD 32 MUL 5312 ADD 7 MUL 7 ADD 32 MUL 5312 ADD 7 MUL 7 0Sample Output:
65536 1 3276816
解决方案:仔细观察,会发现一个规律,每乘多一个2,可能的数就会减小一倍,乘0要特殊判断。
code:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char op[100]; int main() { int n; while(~scanf("%d",&n)&&n) { int temp; int cnt=65536; bool flag=true; for(int i=0; i<n; i++) { scanf("%s %d",op,&temp); if(op[0]=='M') { if(temp==0) { flag=false; } while(temp%2==0) { cnt>>=1; temp/=2; } } } if(!flag||!cnt) printf("1\n"); else printf("%d\n",cnt); } }