题解 CF133B 【Unary】

TRZ_2007

2020-10-05 11:14:11

Solution

**题解 [CF133B 【Unary】](https://www.luogu.com.cn/problem/CF133B)** # Description 就是给你一些字符,每一个字符都有它所代表的数字,代表的数字如下表: ``` '>' -> 1000 '<' -> 1001 '+' -> 1010 '-' -> 1011 '.' -> 1100 ',' -> 1101 '[' -> 1110 ']' -> 1111 ``` (blog里面的表格好像挂了,看题解界面上的吧) 上述数字均为二进制数。把这些字符拼在一起,组成一个**巨大**的二进制数,求把它转换成十进制后对 $10^6+3$ 取模的值。 # Solution 既然要我们最后把它转成十进制,那就不妨先把字符代表的二进制数转为十进制。所以现在的难点就是拼接。 仔细观察上面的二进制数,我们会发现它们都是四位的,于是对于之前拼接的结果设为 $ans$ ,对于每一次拼接,只需要将 $ans$ 向左移4位即可,不要忘记取模。 # Code ```cpp #include <bits/stdc++.h> using namespace std; const int mod = 1e6 + 3; map<char,int> mp; char ch; int ans; void init() { //开一个map,把所有字符所代表的的值存到map里 mp['>'] = 8; mp['<'] = 9; mp['+'] = 10; mp['-'] = 11; mp['.'] = 12; mp[','] = 13; mp['['] = 14; mp[']'] = 15; } int main() { init(); while(scanf("%c",&ch) != EOF) { if(ch != '\n') ans = ((ans << 4) % mod + mp[ch]) % mod; //注意,ans自身乘以16之后为了保险建议对这个值先进行一次取模,最后对总值进行一次取模 else break; } printf("%d\n",(ans + mod) % mod); //以防莫名其妙的负数出现,所以在多加一次取模,但是这题应该是不可能的 return 0; } ```