【郑轻邀请赛 B】base64解密

【题目链接】:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2128

【题意】

【题解】

把密文;
在表中找到每个字符对应的数字;
然后转换成相应的二进制;
如果不足6位就在二进制的前面补零补到6位;
然后每个字符6个二进制6个二进制地排在一起;
然后8位8位地输出;
->最后可以得到”要你输入一个整数x,然后输出x%2017”;

【Number Of WA

0

【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define rep1(i,x,y) for (int i = x;i <= y;i++)
#define LL long long

map <char,int> dic;
string s,temp;
int a[20],tot,x;

string cl(int x)
{
    string d = "";
    while (x)
    {
        d=char((x&1)+'0')+d;
        x>>=1;
    }
    while (int(d.size())<6) d='0'+d;
    return d;
}

char out()
{
    int d = 0;
    for (int now = 1,i = 8;i>=1;i--)
    {
        d+=a[i]*now;
        now<<=1;
    }
    char t = d;
    return t;
}

int main()
{
    //freopen("D:\\rush.txt","r",stdin);
    for (char key = 'A';key<='Z';key++)
        dic[key]=key-'A';
    for (char key = 'a';key<='z';key++)
        dic[key]=key-'a'+26;
    for (char key = '0';key<='9';key++)
        dic[key]=key-'0'+52;
    dic['+']=62,dic['/']=63;
    //cin >> s;
    s="d2hhdCBpcyB0aGUgcmVtYWluZGVyIHdoZW4gdGhlIG51bWJlciBpcyBkaXZpZGVkIGJ5IDIwMTc/";
    temp="";
    int len = s.size();
    rep1(i,0,len-1)
    {
        temp+=cl(dic[s[i]]);
    }
    len = temp.size();
    //cout << temp<<endl;
    /*
    for (int i = 0;i<=len-2;i+=8)
    {
        int j = i+8-1;
        tot = 0;
        rep1(k,i,j)
        {
            ++tot;
            a[tot] = temp[k]-'0';
        }
        putchar(out());
    }
    这段如果不删掉就能打印出信息
    ->“what is the reminder of x after divided by 2017"
    */
    int T;
    cin >> T;
    while (T--)
    {
        cin >> x;
        cout << x%2017<<endl;
    }
    return 0;
}
posted @ 2017-10-04 18:44  AWCXV  阅读(125)  评论(0编辑  收藏  举报