不收快递(首长的无节操掉Rp题)

本题选自某_首长的原创题,-_

先说一下做法:

首先我们甚至不知道做法,也不知道密钥。

我们甚至不知道提交方法……(汗

本题采用GBK_,特殊的编码模式)(真的要考硬编码?

Data 1:

我们直接解码,发现它根本没加密。

获得成就:打开第一个点!

很好,你打开了第一个点,现在,我将告诉你这题应该怎么做,怎么得分。

首先,按照题目所述,你需要解密我所给你的input。每个点的分值我会写在文件的某个部分。比如说,现在这个点的分值是10分。恭喜你获得了十分!

你的最终的分是你所破解分值的max。当然,最后一个点是100分喽~



最后提交的时候,你只要提交这样一个程序

#include <cstdio>

int main(){

	freopen("pass.out","w",stdout);

	printf("score\n");

	fclose(stdout);

	return 0;

}

其中,score是你的分数,你自己填上。

我相信你很有节操,不会乱报分数。

Have fun!

第二个点的破解密码是:7FFFF

……

看后面的点……

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define MAXN (10000+10)
char k[10000]="3746464646";
char s[10000],t[10000];
int s1[MAXN],t1[MAXN],k1[MAXN];
void trans(char s[],int a[])
{
    Rep(i,strlen(s))
    {
        if (isdigit(s[i])) a[i]=s[i]-'0';
        else a[i]=s[i]-'A'+10;
    }
}
void print(int s1[],int n)
{
    Rep(i,n) if (!(i%2)) cout<<(char)(s1[i]*16+s1[i+1]);
}
int main()
{
	freopen("pass2.in","r",stdin);
	freopen("pass2.key","w",stdout);
    scanf("%s",s);
    freopen("CON","r",stdin);
    scanf("%s",k);
    int n=strlen(s);
    trans(s,s1);
    trans(k,k1);

    int lenk=strlen(k);
    Rep(i,n) t1[i]=s1[i]^k1[i%lenk];
    print(t1,n);

	return 0;
}

于是乎我直接在输入端中输入密码,过。

Data 3:

密钥为一个1位字符。

继续找

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define MAXN (10000+10)
char k[10000];
char s[10000],t[10000];
int s1[MAXN],t1[MAXN],k1[MAXN];
void trans(char s[],int a[])
{
    Rep(i,strlen(s))
    {
        if (isdigit(s[i])) a[i]=s[i]-'0';
        else a[i]=s[i]-'A'+10;
    }
}
void print(int s1[],int n)
{
    Rep(i,n) if (!(i%2)) cout<<(char)(s1[i]*16+s1[i+1]);
}
int main()
{
	freopen("pass3.in","r",stdin);
	freopen("pass3.key","w",stdout);
    scanf("%s",s);



    int n=strlen(s);
    trans(s,s1);
    Rep(j,16)
    {
        k1[0]=j;
        int lenk=1;
        Rep(i,n) t1[i]=s1[i]^k1[i%lenk];
        print(t1,n);cout<<endl;
    }
	return 0;
}

悄滤ャ汹安*安┮铝ふШ哝Л铝汹安趴ふソ仟*胀捏谣が安ひ拶歧╃呃湃冥安裨步闷ふ呃安歧汹o耷潘步┮俅拿拿铝要铝撩奈汹安莺厘美ど赚尬揆至汹步ずか剞锚╃仝隆Л要铝安靴步撩奈仟铝婆锚╃汹安|pbetcN|xd呦者步仟荑莆汹安》步锚╃茳剞没捏黎俅汹安*步牤s叟を铝#!η丈步茫隍壑铝勰“安抻锚╃s叟を%步彝女壑搏$' 'W"UT(
终于打开了。

不错。该有的东西都有了。



救援的船只不可能这么快到。得先做个窝再说。



嗯,简易的窝。



做好了~现在,该去找找有没有幸存者了。









太阳已经和地平线相切了,但海岛上一个人影都没有。

看来,幸存者只有自己一个了。

master_miu无奈,只好往回走了。



唉,一个晚上就要这样过去了。不过,本测试点有20分呢,也算是有收获啊。







下一个测试点4号,密钥是:5616F3DE9
彐嚅嚵寵蝤拹>9亪囖拹嬸嚆嗺厴厪嚆蝤拹>9>9嶜鐫嗺嚐鍒亪岤黠嫜饑屵啂拹嗮渑嬇珀鴨拹>9>9遇悷徚徜嗺拹>9>9渑夝蝤M玳悷嬸麞驷驷嚆饒嚆汜囌骒蝤拹>9>9>9>9>9樷轻鈲瀴膈廃禳郁泸鴲焼槈悊夲垕披儏忦堗銙?9寚髧悷汜囌骒鍒嚆溏弶釄嬇蝤拹>9^R@GVAl^ZF鼾悷鍒夝堧潇蝤拹>9>9儠悷釄嬇嶠釞嫜馐娢麞蝤拹亪娢悷倣佈喰嚆勫麟悷醽嚆埪儝拹>9>9>9>9釄嬇佈喰夦悷痫鐚悏u


Data 4:直接用2解

哦——哈——呦——



欸?谁啊。



睁开朦胧的睡眼,master_miu看到(内容图像请自行脑补)。



嗯?

这不是船东的女儿lambda么。

尽管接触不多,但作为游轮上最活跃的存在,master_miu还是见过她的。

虽然现在是被困在了海岛上,但她的脸上依然挂着不变的笑容,像是没有经历过游轮失事的样子。



不过,现在看来,尽管自己也被困在了这里,有这样一个萌妹纸(图像请自行脑补)陪着也不错啊。



嗯?那是谁。

微微立起身,master_miu看到旁边还有一个女生在箱子中找些什么。

她好像是lambda的好朋友alpha。一直不能理解她们两个是怎么成为朋友的,一个过于活跃,一个又过于文静,在船上这么久,自己却只见过两三次,而且每次都只看见她在那里静静地做自己的事情。



这是什么?alpha从箱子中拿出一个很小的密码盒,密码是四位数(十六进制)。



凭着本能的好奇心,master_miu开始研究这个密码了。



本测试点分值20分,下一个点是5号,提示:下一个点依然是剧情点。

Data 5:

继续加油~

我们直接输出所有答案……坑爹来不及。

于是只好将Ctrl+F+master 在此跪舔首长


1、带lambda走,留alpha看家,选择这项请打开6号点,密码D35FEAB38。

2、带alpha走,留lambda看家,选择这项请打开7号点,密码7ECD93EFE。

 

Data6-7:继续用2


Data 8:4位密钥,继续暴力,由于都是英文,可剪枝(根据硬编码原理,省去一大堆不可见字符+中文)

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define MAXN (10000+10)
char k[10000];
char s[10000],t[10000];
int s1[MAXN],t1[MAXN],k1[MAXN];
void trans(char s[],int a[])
{
    Rep(i,strlen(s))
    {
        if (isdigit(s[i])) a[i]=s[i]-'0';
        else a[i]=s[i]-'A'+10;
    }
}
char ans[MAXN];
int size=-1;
void print(int s1[],int n)
{
    Rep(i,n) if (!(i%2)) cout<<(char)(s1[i]*16+s1[i+1]);

    /*
    size=-1;
    Rep(i,n) if (!(i%2)) ans[++size]=(s1[i]*16+s1[i+1]);
    ans[++size]=0;
    printf("%s",ans);
    */
}
int main()
{
	freopen("pass8.in","r",stdin);
	freopen("pass8.key","w",stdout);
    scanf("%s",s);



    int n=strlen(s);
    cout<<n;
    trans(s,s1);
    Rep(j,16*16*16*16*16*16)
    {
        k1[0]=j%16;
        k1[1]=j/16%16;
        k1[2]=j/16/16%16;
        k1[3]=j/16/16/16%16;
        k1[4]=j/16/16/16/16%16;
        k1[5]=j/16/16/16/16/16%16;

        int lenk=6;
        bool flag=0;
        Rep(i,n)
        {
            t1[i]=s1[i]^k1[i%lenk];
            if (i%2==1)
            {
                int tmp=t1[i-1]*16+t1[i];
                if (tmp==0||tmp==10||tmp==13) continue;
                if (tmp<32||tmp>=127) {flag=1;break;}
            }
        }
        if (flag) continue;
        print(t1,n);cout<<' ';
        Rep(i,6) if (k1[i]<10) cout<<k1[i];
            else cout<<(char)(k1[i]-10+'A');
        cout<<endl;
    }
	return 0;
}


由于太多 Ctrl+algorithm,解决~

Bonriddr ` smigitlx e`sidr qroclel. Rupqosd tiat!a gridnd!temls!yot tiat!a fivdn fraqh F ir h`mimtooiao, `nd!thdn nffdrs!to!prnve!it!by!giwinf ynu uhe!vestibes!in!oreer!alnng!thd h`mimtooiao cxcld. Ht voumd beruaioly!be!eary dnotgh!to!vesifx tie qronf:!silplx vdrigy uhau tie qrowiddd bycme hs iamhltnni`n cy bhebkiog vheuhes iu ir a!pesmuuathon!of!thd vdrthcer og V!ane wietier!eabh nf uhe!coosebuthve!edfes!alnng!thd cxcld abtu`llx eyisus hn uhe!gr`ph/ Ynu boumd beruaioly!imqlelenu tiis!vesifhcauioo amgositim uo sun!in!O(o spuase)!tile,!whdre!n hs uhe!leogti og tie dncndiog nf F. Uhur, ` psoog tiat!a iamhltnni`n bycme dxirts!in!a fraqh ban!be!vesifhed!in!pomynnmi`l uimd. 4E6D3E
Consider a slightly easier problem. Suppose that a friend tells you that a given graph G is hamiltonian, and then offers to prove it by giving you the vertices in order along the hamiltonian cycle. It would certainly be easy enough to verify the proof: simply verify that the provided cycle is hamiltonian by checking whether it is a permutation of the vertices of V and whether each of the consecutive edges along the cycle actually exists in the graph. You could certainly implement this verification algorithm to run in O(n square) time, where n is the length of the encoding of G. Thus, a proof that a hamiltonian cycle exists in a graph can be verified in polynomial time. 4F6D3E
\lnljdzq ~#ssjgwwlf#e~pizq oqo}oer- Lvpolsz#twbt?b yqizmd?wesos?zoj#twbt?b xjvzm xqaok X#il#h~niswoqjaq/ ~md?whzm pefzqs?wo?srpue?jt?ay?diijnx#ypv kke?uemwi|fs?jn?lr{fr?blpmg?whz#h~niswoqjaq#cf`lz- Vw hlusg |frkbiqoy?ae?falz zmojdh?wo?uemjff#twf oqope:?pirslf#vzqiyz kkak#twf oqoijdzg |zcsf vp wbmvotpmi~m }z |ke|hiqd hkekkem#ik#il#a?semnukbtvln?lf?whz#vzqtv`el#oy#V?bn{#wwftwfr?fa|k pe kke?`oqpe|vtvue?fdxfs?blpmg?whz#cf`lz#a|wu~olf#egjskp vm kke?dr~sh1#Ypv |lusg |frkbiqoy?jmooerfnk#twjs?uemjfv`akjoq#asdomjtwn kl mvn?jn?L(q#snvamf)?wirf,?thzqe?m vp kke?oeqdtw#oy#twf zmcpgiqd pe X- Kkul/ ~#pmloy#twbt?b wbmvotpmi~m |zcsf z{ilws?jn?b xqaok |bn?ae?uemjfvfd?jn?sosznpni~o kjmz- 506E3E


4F6D3E

于是成功。

Data 9-14,直接用2的。

这时,我遇到了……

还是一个溶洞,还是一个密码锁。

不过,这回机关上没有任何的提示。



但是,这里像是有探险者来过似的,地上掉落着一本笔记,貌似是破解出来原文的一段:



……

在理解了哥德尔不完备性定理之后,我们从这一同样绝妙的定理出发,就会突然发现

……



但愿密钥的长度能远小于这段话的长度……



请解密第15个点,然后用第15个点的密钥加密936A70A0216E0FEBD9AB,作为第19个点的密钥。

接下来的30分钟,作者尝试了各种方法也没成功把中文转成16进制(?菜)话外:没错,我就是菜,别看我……

Data 15+:???????



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值