speed
题目

思路
x是227的阶乘,很明显这个数字很大,直接计算甚至电脑计算都不现实
def f(x): //定义了一个函数
res = 0 //将res初始化为0
while x: //while循环
res += x % 10 //x%10相当于取x最左边的数
x //= 10 //x/10相当于去除x最左边的数
return res
所以说,这道题是求227的阶乘,每一位的和,并最后用哈希加密
但我们不可能去计算这个阶乘
在这里我讲两个重要思想,第一个是递归思想,实际上这题并不是递归思想,但递归思想告诉我们,要将问题分解为更小的,相似的子问题,我们无法求出来227的阶乘的每一个数字和,我们先去求21,22,23的阶乘,看看能否找到规律
还有一个重要的点,就是任何人学习递归举的第一个例子都是阶乘,所以看到本题的阶乘,就要想到递归
第二个思想是从一般中找特殊,要求227的阶乘我们去求2n的阶乘
先计算(2^n)!的数字和,从 0 开始任取小的 n 进行计算,得到一串数字:
1,2,6,9,63,108,324,828,1989
写到这一步,在加上看write up,我就明白了,本题不是一道计算题编写程序的题,而是一道数列题
如果要找数列,就要用oeis网站(把它当成你要是使用的工具)

对于这个网站,不要去搜索数列名字,因为你不知道它专业的方式是如何命名的,也不要去纠结每个数列的序列号,因为这是人家为了便于整理,我们名字都不知道,更别说去搜序列号。
而是,通过自己的计算,算出要查找数列的前几个,如本题是1,2,6,9,63,108,324,828,1989,直接搜索这个数列内容

于是乎,我们就可以搜索出来了,可以看到这个数列序列号为A244060,专业名字为Sum of digits of (2^n)!
因为从2的0次开始,所以找到数列中第28个数字,就是4495662081
再用sha256加密(在线网站也可以)
所以本题flag为flag{BBDEE5C548FDDFC76617C562952A3A3B03D423985C095521A8661D248FAD3797}
递归思想
递归思想是一种在数学、计算机科学和其他领域中常用的解决问题的方法。它基于一个简单的原则:一个问题的解决方案可以被分解为更小的、相似的子问题。递归思想通常包括两个主要部分:基本情况(base case)和递归步骤(recursive step)。
基本情况(Base Case)
基本情况是递归算法的停止条件。它定义了当输入问题的规模足够小,可以直接解决而不需要进一步递归时的情况。没有基本情况,递归将无限进行下去,最终导致栈溢出错误。
递归步骤(Recursive Step)
递归步骤是算法的核心,它将问题分解为一个或多个更小的子问题,这些子问题与原始问题相似,但规模更小。递归步骤必须确保每次递归调用都能使问题规模减小,从而最终达到基本情况。
递归的工作原理
- 问题识别:识别问题是否可以用递归方法解决。
- 定义基本情况:确定问题最简单的形式,即可以直接解决而不需要进一步递归的情况。
- 定义递归步骤:将问题分解为更小的子问题,这些子问题与原始问题相似,但规模更小。
- 递归调用:通过调用自身来解决子问题。
- 组合结果:将子问题的解决方案组合起来,形成原始问题的解决方案。
递归的例子
一个经典的递归例子是计算阶乘(n!):
def factorial(n):
# 基本情况:如果n为0或1,阶乘为1
if n == 0 or n == 1:
return 1
# 递归步骤:n的阶乘是n乘以(n-1)的阶乘
else:
return n * factorial(n - 1)
在这个例子中,基本情况是当n为0或1时,函数返回1。递归步骤是计算n * factorial(n - 1),这将问题规模减小到n-1。
递归的注意事项
- 避免无限递归:确保递归步骤能够使问题规模减小,并且最终达到基本情况。
- 栈溢出:在某些编程语言中,递归调用过多可能会导致栈溢出。在这些情况下,可以考虑使用迭代方法或增加栈的大小。
- 性能:递归可能不是解决所有问题的最佳方法,因为它可能涉及大量的函数调用和重复计算。在某些情况下,使用迭代方法或动态规划可能更高效。
递归思想是一种强大的问题解决工具,它可以帮助我们以简洁和优雅的方式解决复杂问题。
SHA-256(Secure Hash Algorithm 256 bit)是一种加密哈希函数,它属于SHA-2(Secure Hash Algorithm 2)算法家族中的一员。SHA-2算法家族包括了不同位数的哈希函数,如SHA-224、SHA-256、SHA-384和SHA-512等,它们都使用相同的基本算法,但产生不同长度的哈希值。
sha256
SHA-256的主要特点包括:
-
输出长度:SHA-256产生一个256位(32字节)的哈希值。
-
安全性:SHA-256被广泛认为是非常安全的,到目前为止,没有发现有效的碰撞攻击方法,即找到两个不同的输入,它们产生相同的哈希值。
-
速度与效率:SHA-256在大多数现代处理器上运行速度较快,且计算效率较高。
-
应用广泛:SHA-256被广泛应用于各种安全协议和加密算法中,包括比特币和许多其他加密货币的区块链技术,以及TLS/SSL安全通信协议。
-
不可逆性:像所有哈希函数一样,SHA-256是单向的,这意味着从哈希值几乎不可能逆向推导出原始数据。
-
敏感性:即使是微小的数据变化也会导致完全不同的哈希值,这称为雪崩效应。
SHA-256的计算过程包括几个步骤:
- 预处理:包括填充和添加长度,以确保消息的长度是512位的倍数。
- 初始化哈希值:设置一个初始的哈希值。
- 处理消息:将消息分成512位的块,并对每个块应用一系列的操作,包括位的加法、逻辑运算、移位等。
- 产生最终哈希值:将所有块处理完毕后,将初始哈希值与处理过程中的中间值合并,产生最终的256位哈希值。
在Python中,你可以使用内置的hashlib模块来计算字符串的SHA-256哈希值,如下所示:
import hashlib
# 待计算的字符串
text = "Hello, World!"
# 创建sha256哈希对象
hash_object = hashlib.sha256(text.encode())
# 获取16进制格式的哈希值
hash_hex = hash_object.hexdigest()
print(hash_hex)
这将输出字符串"Hello, World!"的SHA-256哈希值。
1261

被折叠的 条评论
为什么被折叠?



