例题6.20 信息解密 UVa1457

博客介绍了如何解决UVa1457问题,涉及数论中的原根概念和模拟算法。首先,通过离散对数方法转化线性同余方程求解,然后详细处理时间模拟,包括闰年、闰秒的判断。代码实现中利用rand()函数寻找原根,提高效率。
摘要由CSDN通过智能技术生成

1.题目描述:点击打开链接

2.解题思路:本题是一道模拟+数论的综合题。因此可以数论部分和模拟部分分开进行。首先,除去日历,其实本题就是要求解x^q≡a (mod p)。这需要用到数论中原根的知识,读者可以网上或者初等数论书中找到相应的内容。假设我们现在已经有了p的原根m,那么该如何求解呢?可以用离散对数的方法来做,方程两边同时取m的离散对数,得q*x'≡a'(mod p-1)。这里的x'就是x以m为底模p的离散对数,a'同理。这样问题就转化为求解线性同余方程了。不难得到该方程的所有解系,一共有gcd(q,p-1)个解。有了这些解,就可以开始模拟时间了。


本题对时间的模拟细节比较多,首先需要处理年份是否为闰年,还要考虑一年中是否存在闰秒。为了便于处理,我们可以事先对每个月的天数打表,并把1天的秒数设为一个常量。这样,第一步先从解中不断地减去一年的秒数来获得是第几年,用同样的方法获得第几个月,如果发现恰好是闰秒,就单独输出,否则继续按照上述方法得到时分秒。最后输出即可。详细细节见代码。


本题求原根利用rand()函数生成测试来求解,因为原根在2~MOD-1之间,因此这种方法的效率还是比较高的。

3.代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值