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.代码: