“强网杯-强网先锋-SpeedUp-wp”

题目描述

题目内容:

Just calculate a factorial。

Task

x=(pow(2,27))! (二的二十七次方的阶乘)

1
2
3
4
5
6
def f(x):
res = 0
while x:
res += x % 10
x //= 10
return res

flag 为 flag{sha256(f(x))}

解题过程

1.一开始想取巧的,搜了搜发现了求近似阶乘的斯特林公式,嘿不行,求得数需要准确的数字,所以必须要把数字算出来

2.然后经过一阵搜索,我发现了救赎,那就是gmpy2库中的gmpy2.fac()求阶乘的函数啦,代码这样写

1
2
3
4
5
import gmpy2
n = 134217728
result = gmpy2.fac(n)
with open("E:\\2.txt", "w") as file:
file.write(str(result))

算出来的数据直接900M多。

3.数据算出来了那就开始把每一位数字相加,但是接近10亿的数字没有一个在线网页工具受得住的,放一个崩一个

经过搜索,发现Linux可以很好的处理这么大的数据

linux统计字符串频数,在Linux的命令行中实现字符出现频率统计的方法-CSDN博客

这是参考博客

我先用强大记事本将文本中的0删去,再依次将1,2,3,4,5,6,7,8,9替换为A,B,C,D,E,F,G,H,I

将文本传输至Linux虚拟机,执行指令可以得到

99923066 B
99913041 E
99908925 H
99907349 D
99903199 F
99901376 I
99895867 G
99892637 A
99884888 C

然后

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import hashlib
B=99923066
E=99913041
H=99908925
D=99907349
F=99903199
I=99901376
G=99895867
A=99892637
C=99884888
SUM=A*1+B*2+C*3+D*4+E*5+F*6+G*7+H*8+I*9
print(SUM)
# 创建一个 SHA256 的加密对象
hash_object = hashlib.sha256()
# 更新加密对象中的信息
hash_object.update(b'4495662081')
# 打印加密后的结果
print(hash_object.hexdigest())

得到

1
2
4495662081
bbdee5c548fddfc76617c562952a3a3b03d423985c095521a8661d248fad3797

即flag{bbdee5c548fddfc76617c562952a3a3b03d423985c095521a8661d248fad3797}


“强网杯-强网先锋-SpeedUp-wp”
http://example.com/2023/12/22/“强网杯-强网先锋-SpeedUp-wp”/
作者
clotten
发布于
2023年12月22日
许可协议