概述
例题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)%mod⟶ax1 + b−k∗mod=x2同理可以得到x3=(a2x1+ab+ak∗mod+b)%mod⟶x3=(a2x1+(a+1)b)%mod在枚举a的情况下:可以求得%mod意义下的((a+1)b)%mod=(x3−a2x1%mod+mod)%mod=temp(a+1)b−k1∗mod=temp此时b和k1为未知,利用扩展欧几里得算法g=ext_gcd(mod,(a+1),k1,b)求出b,g,注意这时b可能为负数记得转化为%mod意义下的数b=((b∗temp/g)%mod+mod)%mod最后逐个验证T1,T3,....,T2n−1即可
最后
以上就是曾经信封为你收集整理的[算法竞赛入门经典]数论刷题专栏的全部内容,希望文章能够帮你解决[算法竞赛入门经典]数论刷题专栏所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复