我是靠谱客的博主 曾经信封,最近开发中收集的这篇文章主要介绍[算法竞赛入门经典]数论刷题专栏,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

例题10-2 不爽的裁判(Disgruntled Judge, NWERC 2008, UVa12169)
有个裁判出的题太难,总是没人做,所以他很不爽。有一次他终于忍不住了,心 想:“反正我的题没人做,我干嘛要费那么多心思出题?不如就输入一个随机数,输出一个 随机数吧。”
于是他找了3个整数x1、a和b,然后按照递推公式xi=(axi-1+b) mod 10001计算出了一个长 度为2T的数列,其中T是测试数据的组数。然后,他把T和x1, x3,…, x2T-1写到输入文件中,x2, x4,…, x2T写到了输出文件中。
你的任务就是解决这个疯狂的题目:输入T, x1, x3,…, x2T-1,输出x2, x4,…, x2T。输入保 证T≤100,且输入的所有x值为0~10000的整数。如果有多种可能的输出,任意输出一个即可。
【分析】
如果知道了a,就可以计算出x2,进而根据x3=(ax2+b) mod 10001算出b。有了x1、a和b, 就可以在O(T)时间内计算出整个序列了。如果在计算过程中发现和输入矛盾,则这个a是非 法的。由于a是0~10000的整数(因为递推公式对10001取模),即使枚举所有的a,时间效 率也足够高。
x 2 = ( a x 1   +   b ) % m o d ⟶ a x 1   +   b − k ∗ m o d = x 2 同 理 可 以 得 到 x 3 = ( a 2 x 1 + a b + a k ∗ m o d + b ) % m o d ⟶ x 3 = ( a 2 x 1 + ( a + 1 ) b ) % m o d 在 枚 举 a 的 情 况 下 : 可 以 求 得 % m o d 意 义 下 的 ( ( a + 1 ) b ) % m o d = ( x 3 − a 2 x 1 % m o d + m o d ) % m o d = t e m p ( a + 1 ) b − k 1 ∗ m o d = t e m p 此 时 b 和 k 1 为 未 知 , 利 用 扩 展 欧 几 里 得 算 法 g = e x t _ g c d ( m o d , ( a + 1 ) , k 1 , b ) 求 出 b , g , 注 意 这 时 b 可 能 为 负 数 记 得 转 化 为 % m o d 意 义 下 的 数 b = ( ( b ∗ t e m p / g ) % m o d + m o d ) % m o d 最 后 逐 个 验 证 T 1 , T 3 , . . . . , T 2 n − 1 即 可 x_2 =(ax_1space+ space b)%mod longrightarrow ax_1space + space b - k * mod = x_2\ 同理\ 可以得到x_3 = (a^2 x_1 + ab + ak * mod + b)%modlongrightarrow x_3 =(a^2x1 + (a+1)b)%mod\在枚举a的情况下:\ 可以求得%mod意义下的((a+1)b)%mod=(x3-a^2x_1%mod + mod)%mod = temp\ (a+1)b - k_1*mod = temp\此时b和k_1为未知,利用扩展欧几里得算法g=ext_gcd(mod,(a+1),k_1,b)\求出b,g,注意这时b可能为负数记得转化为%mod意义下的数\ b = ((b * temp /g)%mod + mod)%mod\最后逐个验证T_1,T_3,....,T_{2n-1}即可 x2=(ax1 + b)%modax1 + bkmod=x2x3=(a2x1+ab+akmod+b)%modx3=(a2x1+(a+1)b)%moda:%mod((a+1)b)%mod=(x3a2x1%mod+mod)%mod=temp(a+1)bk1mod=tempbk1g=ext_gcd(mod,(a+1),k1,b)b,g,b%modb=((btemp/g)%mod+mod)%modT1,T3,....,T2n1

最后

以上就是曾经信封为你收集整理的[算法竞赛入门经典]数论刷题专栏的全部内容,希望文章能够帮你解决[算法竞赛入门经典]数论刷题专栏所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部