申诉文章(已过,谢谢评委!)

· · 闲话

我刚刚写了篇文章来参加“你要魔怔杯”鲜花大赛,可是我却被评委打回了,说是不符合题意。我真的花了很长时间来审题,我基本上确信我的理解没有太大的问题。所以我把参赛的过程记录下来以进行申诉,希望评委理解。

“你要魔怔杯”鲜花大赛已经举办了很长时间,是时候有人作为 21 体综合征的患者来参与这场比赛了。

这真的可能吗?

真的能做到吗?

今天,我将进行个前无古人的挑战。我将阅读“你要魔怔杯”的规则,之后撰写篇符合要求的文章,最后再按照要求投稿,这样便算是成功完成了挑战。但是在这之前,还有个问题:

“你要魔怔杯”鲜花大赛已经举办了很长时间,是时候有人作为 21 体综合征的患者来参与这场比赛了。

这真的可能吗?

真的能做到吗?

点进比赛链接之后,首先看到的是这个画面。

其实我现在不大确定我现在应该如何行动。第 行的文字中包含“离开洛谷”的字样,但我并不知道离开洛谷之后我还是否可以参加这场比赛。要知道,自从 天之前我有了这个挑战的打算之后我就没再敢最小化浏览器或是切到其他页面。你知道,参加比赛总是有着很复杂的流程和规则。

我仔细研究了下这个页面,最后认定它的意思可能正是提醒我在参赛过程中不要离开洛谷,因此最下面的按钮应该是“我已了解规则”的意思。我点击了这个按钮,因为看上去我应该要抓紧时间,不然我的电脑很可能会支撑不住然后关机,这样我也就会被取消资格了。

根据这个页面的字数,我判断这应该就是比赛的详情页。我长舒了口气,毕竟我成功来到了详情页,这已经是我很多类似的尝试中进度相当好的了。

现在我的任务便是在这段文字中挑出比赛的规则。这真的很困难。更让我紧张的是,这里的文字的似乎真的并不和我曾经见过的有 21 个字的诗词里的字同样多……这真的很让我困惑。

我尝试了很久,也没有办法理解这大段文字。看来我似乎需要些其他的手段。按照我的理解,重要的信息往往会存在重复出现,那么我们便需要想办法找到些重复的子串,在这些重复的子串里我也许就可以得到需要的信息了。这个问题看似很困难,但我想,我已经有办法来解决它了。

“你要魔怔杯”鲜花大赛已经举办了 届,而它所在的平台洛谷,正是许多编程爱好者的聚集地。这意味着我可以向他人求助如何用程序做到上述操作,并且在这个过程中我不需要离开洛谷!当然,我是不会直接向他人询问比赛规则的——作弊就没意思了!

很快便有位好心人给了如下的代码,它可以求出整个字符串的所有子串出现的次数。我相信这正是我想要的。

#include<cstdio>
#include<cstring>
#include<string>
#include<map>
using namespace std;
char s[407693];
map<string,int> m;
signed main(){
    scanf("%s",s+1);
    int n=strlen(s+1);
    for(int i=1;i<=n;i++){
        string s0="";
        for(int j=i;j<=n;j++){
            s0+=s[j];
            if(m.find(s0)!=m.end())m[s0]++;
            else m[s0]=1;
        }
    }
    for(int i=4000;i>=0;i--){
        for(auto s0:m)if(s0.second==i)printf("%s %d\n",s0.first.c_str(),i);
    }
} 

我将这份代码放到了洛谷在线 IDE 上,这样我就可以在不离开洛谷的情况下运行程序了。

可是这份程序却并没有正常运行。我只好上题库里搜索这个现象的成因。我搜索了“字符串”,然后点开了道题,发现它的输入只有英文。那么我也许也应该把汉字转化成英文,然后再去掉其他的特殊符号。不知道数字可不可以保留,但至少文章里没出现,所以现在不用考虑。虽然这些字我并不全认识,但我认识拼音,这样我就可以让电脑朗读这段文字,然后我来写出拼音了。

diyijiehttpswwwluogucomcnarticlebrknjkdierjieniyaomozhengbeixianhuadasaidierjieniyaomozhengbeixianhuadasaicaiyonghuatizuowendexingshitimuruxiasuxingceshixuanzeyigeqisushuxieyipianwenzhangzhegeshuyinggaishiteshudeyejiushishuoruguoxiangyongbiedeshulaixiebuxianyuqisushujiunanyidadaoxiangjindexiaoguoweilejinhangsuxingceshiyaoqiuzhegesushudeerjinzhiweishuzaiyineiranernibuyongtaiqietibirulunzuixiaodeqisushu3dexingzhijiushiyigetaiqietideliziwomenyouzuimozhengqietijiangdajiakeyijingzhengyixiameirentougaobuchaoguoliangpiankeyichehuiyitoudexuyaoshizaigerenbokeshanggongkaidewenzhangzaitougaojiezhizhiqiankaishigongkaijikebubishiluogubokelingwailuogujiantiebanyileiyeshikeyidezhinengyouzuozhebenrentougaomeipianzishubushaoyubuduoyubunengshiwuyiyiwenzhanghuowanquanbumozhengdewenzhangtougaojiangyujiezhibuguonijiaoqishiyemeiguanxitougaoshijianbucanyupingjiangwomenhuiweihuyigegongkaideyijingshoudaodezuopinliebiaohttpswwwluogucomcnpastelltwcbxtougaoshiqinggaozhiwoshifouxiwangnidezuopinchuxianzailiebiaoshangruguochuxiannidezuopinkenengjifatarendelingganruguobuchuxiannidezuopinhuizaijiegaozhihouduidajiakejiannihuizaijiegaozhihoujinqunruguonimeijinjidetixingwopingfenguizewomenzanshihuanmeixianghaodanshikeyigaosunidagaihuiyouzhexiejiangxiangzuijiawencaizuijiagousizuijiamozhengzuiqiangganranlizuiwaikejishuzuichouxiangzuimozhengqietizuidazhengyidangranhenkenenghuanhuiyouqitaderuguonijuedexiangsheshajiangxiangkeyigenwoshuobeipandingweilitidewenzhangjiangbunengcanyupingjiangwoquannishaolitiyinweizhegezhiyaonixiangqietishizhendebuhuilitinizuihaojiaruqqqunyinweinikenenghuixuyaoweizijibianhutougaodeshihouhuibanilajinlaiqqlianxirangertougaomeizhouriqinglitougaoqingqiuzhouneirenhebuchulidushizhengchangdechuliyeshizhengchangdezhouridangtiandezuiwanxiazhourichulijianyinitougaodexiayigezhouriguanzhuzijidegaojianshifoudedaochulidangranshijishangyibandangtianjiuchuliwanle

过了 个小时我终于成功将整段文字都变为了字母。可我将其输入程序之后,却显示“超过时间限制”。我猜想,这可能和这段文字实在是太长了有关,因此我也许只能将从这段文字截取些内容来分析了。这应该问题不大,毕竟重要的信息重复出现的位置应该会比较临近。不过让我安心的是这个规则的确已经复杂到了连程序都难以分析,至少我没有在些很容易的地方浪费时间。

我随便选择了段,尽管被提示“超出输出限制”,我还是得到了下面的结果:

i 16
u 13
e 10
h 10
s 10
sh 8
g 7
n 7
a 6
hu 6
shu 6
y 5
an 4
is 4
ng 4
x 4
xi 4
es 3
esh 3
eshu 3
ia 3
ian 3
ie 3
o 3
us 3
ush 3
ai 2
ang 2
b 2
d 2
de 2
ey 2
hi 2
ish 2
isu 2
isus 2
isush 2
isushu 2
j 2
ji 2
q 2
qi 2
qis 2
qisu 2
qisus 2
qisush 2
qisushu 2
shi 2
su 2
sus 2
sush 2
sushu 2
uo 2
ushu 2
ux 2
uxi 2
xia 2
xian 2
xie 2
yi 2
z 2
zh 2
ais 1
aish 1
aishi 1
aishit 1
aishite 1
aishites 1
aishitesh 1
aishiteshu 1
aishiteshud 1
aishiteshude 1
aishiteshudey 1
aishiteshudeye 1
aishiteshudeyej 1
aishiteshudeyeji 1
aishiteshudeyejiu 1
aishiteshudeyejius 1
aishiteshudeyejiush 1
aishiteshudeyejiushi 1
aishiteshudeyejiushis 1
aishiteshudeyejiushish 1
aishiteshudeyejiushishu 1
aishiteshudeyejiushishuo 1
aishiteshudeyejiushishuor 1
aishiteshudeyejiushishuoru 1
aishiteshudeyejiushishuorug 1
aishiteshudeyejiushishuorugu 1
aishiteshudeyejiushishuoruguo 1
aishiteshudeyejiushishuoruguox 1
aishiteshudeyejiushishuoruguoxi 1
aishiteshudeyejiushishuoruguoxia 1
aishiteshudeyejiushishuoruguoxian 1
aishiteshudeyejiushishuoruguoxiang 1
aishiteshudeyejiushishuoruguoxiangy 1
...

程序的输出结果我其实看不大懂,但我的直觉告诉我这个程序会优先输出比较重要的信息,而在靠前的信息里我应该选择比较长的。经过权衡,我认定这个规则的重点应该是 qisushu 这个子串。

接下来我要做的便是搞懂这个子串的含义,首先我要做的应该是将它还原回中文,这个很容易做到,我只要用输入法就可以了。然后我需要在搜索引擎上搜索它,这稍微有些困难,因为我需要小心地新建个窗口在洛谷页面的上方,不然我可能就会被判定为“离开洛谷”。总之,我还是做到了。

起初,我并没有得到什么有意义的答案,直到我看到了这样条搜索结果:

在这里我终于看到了数字,也就是 21。我顿时感觉很亲切。我相信,经过了这么久的逻辑缜密的寻找,这肯定就是这次比赛的主题了。

这就是我参加这个比赛的过程。相信你看了这个之后,也会认为我刚刚提交的那篇探讨 21 作为仅有的数字的孤独的文章也可以算是切题的吧?另外,我不仅想吐槽下电脑输入的弊端了,每次我要输入 21 时,都有可能会打出 12 这个诡异的存在,我对它完全陌生,它却又和 21 莫名地相似,简直都有点恐怖谷了……有时我还可能打出这个数字的左半边或是右半边,这种情况比较少见,不过遇到了就更是吓人了,可我今天——比如说在程序的输出结果里——却好像见到了好几次这样的“不完整数字”……要是用笔和纸写,就肯定不会出现这种情况了。

大概就是这样了,不过如果我还可以修改文章的话,我也可以试试写写诡异的幻影 1221 以及两个残缺数字的关系,这应该也会让我的文章更有趣的!

刚才我又和评委交流了下,他提到了个叫“素数”的概念,我感到很奇怪,因为我确实没有听过这个说法。不过,洛谷上总是会有可以利用的资源!我在题库中搜索“素数”,之后:

```cpp #include<cstdio> #include<cstdlib> #include<ctime> #include<cmath> #define int long long int t,n,res[7]={2,325,9375,28178,450775,9780504,1795265022},ans,cnt; inline int qpow(__int128 n1,__int128 n2,__int128 mod){ __int128 n3=n1%mod,n4=1; while(n2){ if(n2&1)n4*=n3,n4%=mod; n3*=n3,n3%=mod;n2>>=1; }return (int)n4; } inline int mil(int s){ for(int i=0;i<7;i++){ if(res[i]%s==0)continue; if(qpow(res[i],s-1,s)!=1)return 0; int d=s-1;while(~d&1){ if(d>>=1,qpow(res[i],d,s)==s-1)break; else if(qpow(res[i],d,s)!=1)return 0; } } return 1; } inline int gcd(int a,int b){ if(!b)return a; return gcd(b,a%b); } inline int rho(int now){ cnt++; __int128 s=0,t=0,c=1ll*rand()%(now-1)+1,val=1; for(int goal=1;;goal<<=1){ for(int stp=1;stp<=goal;stp++){ t=((__int128)t*t+c)%now; val=(__int128)val*(t>s?t-s:s-t)%now; if((stp%127)==0){ int d=gcd(val,now); if(d>1)return d; } } int d=gcd(val,now); if(d>1)return d; s=t;val=1; } } inline void fac(int now){ if(now<=ans)return; if(mil(now)){if(ans<now)ans=now;return;} int ins=now;while(ins>=now)ins=rho(now); while(now%ins==0)now/=ins; fac(now);fac(ins); } inline int read(){ char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } signed main(){ while(1){ n=read(); if(n==0)continue; if(n==42)break; if(mil(n)){ printf("Prime\n"); continue; } ans=1; cnt=0; fac(n); printf("%lld\n",ans); } } ``` 我感到很奇怪,因为只有 $21$ 是数字啊。我输入了 $21$,得到的结果是这个样子: ```7``` 我完全不知道这是什么意思,现在我已经不太清楚什么是数字了,所以我只好将原先的整篇文章都输入程序。 ![](https://cdn.luogu.com.cn/upload/image_hosting/syoy5jh1.png) 令人高兴的是,这次程序输入中文之后也可以运行了,这样我就不需要再花上很长的时间来把文字变成拼音了。我得到了这样的输出: ``` 7 7 Prime 3 Prime 7 Prime 2851 Prime Prime Prime Prime 5 Prime 2 Prime 2 Prime 5 5 5 2 Prime Prime 3 3 3 Prime 2 2 2 2 2 Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime 2 29 7 7 7 3 7 3 7 ``` 我得到了很多个 ```Prime```,这应该意味着我的文章很符合要求。但是既然没有通过,那么也许应该让输出全为 ```Prime```。我又试了试将这份输出输入进程序,结果如此: ``` Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime Prime ``` 看来这份输出才是我们真正需要的!我把这个输出交给了评委,但是他却提醒我“不能包含字母”。因此我只好挨个将它里面的字母删掉: ``` 7 7 3 7 2851 5 2 2 5 5 5 2 3 3 3 2 2 2 2 2 2 29 7 7 7 3 7 3 7 ``` 我把它交给评委,令人惊奇的是评委终于说这是符合要求的了!我感到很激动,因为这就意味着我作为 $21$ 体综合征的患者来参与比赛的挑战成功了!这实在是个曲折的旅程、艰难的挑战。 从这之后我还会进行其他类似的挑战,我们下期再见!