SPOJ 1881 Instruction Decoder

Description

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]
Mathews sees a segment of code, but doesnot know what value the register had before the code was being executed. How many possible values can the register have after the segment completed execution?
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
0
Sample Output:
65536
1
32768
16

看第一眼题的时候觉得这题肯定不难,于是果断开题,结果读题愣是读了20分钟,还没有看懂题意~(默默表示被百度翻译坑了一发)
后来冷静想了一下,发现ADD操作可以直接忽略,只需要把MUL的数因数分解就可以了。
当然,这题数据貌似卡的不严,暴力打表也可以做出来。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
    int n;
    while(~scanf("%d",&n) && n)
    {
        int temp;
        char op[10];
        int cnt = 65536;
        bool flag = true;
        for(int i=0; i<n; i++)
        {
            scanf("%s %d",op,&temp);
            if(op == "MUL")
            {
                if(temp == 0)
                {
                    flag = false;
                    break;
                }
                while(temp % 2 == 0)
                {
                    cnt >>= 1;
                    temp /= 2;
                }
            }
        }
        if(!flag || !cnt)
            printf("1\n");
        else
            printf("%d\n",cnt);

    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值