题目
在网上看到一道有意思的算法题:在二战时,德军使用一个密码生成器Enigma对通信进行加密。
Enigma源自于希腊文,英语解释为“谜,不可思议的东西”,用几个机械转盘+电子线路组成,可以生成较强的密码,相比”凯撒法”的简单替换非常难破解,在二战初期帮助纳粹取得了优势。
题目就是给出三个参数(最小值、最大值、转盘数)写出可能的Enigma密码总数,要求第一个数与后边的数互质,由于结果数特别大需要对特定值取余。
算法流程
- 首先计算因式分解需要的质数表
- 利用质数表对每个可用的数进行因式分解
- 利用容斥原理,对每两个数进行比较,记录每个数可能与它组合的数的数量
- 最后对所有可能性进行计算加总,注意加总时对特定值取余
算法示例
1 |
|