夜夜的数据加强
背景
有些事情总会让夜夜和更多的人恼火。举个例子吧...
你AC了一个题目,可是你总感觉那个题目数据太水了......
那是一个树形的题目,为了生成一颗树,作者表示你要用特定的办法来生成树.理论上这个数据是随机的.
然而,你发现,你可以想办法把这个”随机”的数据给变成不随机的,换句话说,你只要找到合适的初始值,就可以让这个代码生成你想要的树.
描述
那一段代码如下
[C/C++代码]
int X,A,B,C;
int random()
{
int Return_Value=X;
X=((long long)X*A+B)%C;
return Return_Value;
}
void make_tree()
{
for (int i=1;i<n;i++) fa[i]=random()%i;
}
[Pascal代码][出题人不记得怎么写了...大概就写成这样吧能看就行]
var x,a,b,c:int64;i:longint;
function random:longint;
var Return_Value:longint;
begin
Return_Value:=x;
x:=(x*a+b) mod c;
exit(Return_Value);
end;
procedure make_tree;
begin
for i:=1 to n-1 do
fa[i]:=random() mod i;
end;
现在,你已经构造出了一组fa[i]使得某个程序炸掉,问题是,你该怎么构造整数X,A,B来构造整个fa数组?如果有多个构造方案,请全部输出出来.注意:0<=X,A,B<C
格式
输入格式
第一行两个整数,n和c
第二行,n-1个整数,即fa[1],fa[2],fa[3],...,fa[n-1]
输出格式
若干行
每一行,三个整数,X,A,B
注意:X,A,B<C(很重要所以说两遍)
如果有多个,请先输出X小的,再输出X大的(即以X为第一关键字从小到大输出)
如果还有多个,请先输出A小的,再输出A大的(即以A为第二关键字从小到大输出)
如果仍然有多个,请先输出B小的,再输出B大的(即以B为第三关键字从小到大输出)
如果一个构造方案也没有,请输出”Unsuccessful Hack Attempt”(不含引号,注意大小写)
样例1
样例输入1
5 3
0 1 2 3
样例输出1
Unsuccessful Hack Attempt
限制
对于20%的数据,n=1
对于45%的数据,n<=5,c<=5
前45%的数据和最后5%的数据,对于c和n之间无任何保证
对于70%的数据,n<=40000,c<=50
对于95%的数据,n<=100000,c<=300
在45%~95%这些数据中,保证c<n-10
对于100%的数据,n<=100000,c<=400,fa[i]<=10000
数据保证,输出文件不超过1MB
每一个测试点时限1秒。
提示
对于样例,在mod 3的条件下,是永远得不到3的