【Hash Killer III】一个蒟蒻的5分代码
8月30日拿的5分,我的洛谷文章见这里:https://www.luogu.com.cn/discuss/1172583
非常朴素的想法:使用20组固定的 mod1 和 mod2(都是 int32 范围内的素数),并为每个 base(从2到21)生成一个特殊字符串。最终将这些段连接起来输出。
其实就是在赌评测机恰好使用了这组固定的mod1和mod2组合。
结果。。真的赌对了
后来我又试了几次,都是0分,不过希望能够给一些人一点思路和突破口
update:2025-10-14 14:18
多次实验发现,这个代码对于前几次提交5分概率极大,之后不管是什么代码能拿5分的概率都极小,后来我还开了好几个小号(10分钟邮箱),结果也是同理,为此本蒟蒻做出了一下猜测:
1.评测机一开始会给你放到简单池里,等你提交次数变多或者拿了5分后,会将你的代码放到更严格的数据池里
应对方法:疯狂开小号
2.评测机的种子会和你的提交次数有关
以上2个仅根据实验结果作为猜想,并没有进行准确的证明和实验,希望有人可以再对其数据进行一些拓展并发帖
有思路请积极发帖!!!
代码 (提交记录):
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string convert(unsigned long long M, int base, int l) {
string s;
while (M) {
int digit = M % base;
s.push_back('a' + digit);
M /= base;
}
while (s.size() < l) {
s.push_back('a');
}
reverse(s.begin(), s.end());
return s;
}
int main() {
vector<unsigned long long> mod1 = {
1000000007,
1000000009,
1000000021,
1000000033,
1000000087,
1000000093,
1000000097,
1000000103,
1000000121,
1000000181,
1000000207,
1000000223,
1000000241,
1000000271,
1000000289,
1000000297,
1000000321,
1000000349,
1000000363,
1000000403
};
vector<unsigned long long> mod2 = {
1000000009,
1000000021,
1000000033,
1000000087,
1000000093,
1000000097,
1000000103,
1000000121,
1000000181,
1000000207,
1000000223,
1000000241,
1000000271,
1000000289,
1000000297,
1000000321,
1000000349,
1000000363,
1000000403,
1000000421
};
int l = 62;
string s;
for (int i = 0; i < 20; i++) {
int base = i + 2;
unsigned long long M = mod1[i] * mod2[i];
string t = convert(M, base, l);
s += string(l, 'a');
s += t;
}
int n = s.size();
cout << n << " " << l << endl;
cout << s << endl;
return 0;
}

浙公网安备 33010602011771号