潜意识(conscious)

 

【题目背景】

每个人的潜意识里,都有一个红太阳,指引自己前行。

 

【题目描述】

kblack 是一名 S 学家。他最喜欢的事,就是增加自己的 S。

kblack 有特殊的渠道来增加自己的 S,西方的华菜士就是他的 S 供应商。kblack 每花 1 丁爷爷币,就可以从华菜士那买到a 个单位的 S。kblack 月入百万,所以他有无穷无尽的丁爷爷币来购买 S。

然而,由于 S 这种物品的特殊性,kblack 不能无穷无尽地获得 S,就像俗话 ‘‘神龟虽寿,犹有尽时’’ 说的那样。在每次购买S 之后,如果 kblack 持有的 S 数目达到或超过阈值m,都会有东方神秘力量来没收他的m个单位的 S。

不过,塞翁失马焉知非福,kblack 的潜意识里,其实有一个数 sub 指引着他前进。他希望他持有的S 数目,尽可能地接近sub。从这个角度看,东方的神秘力量反而对他起了帮助的作用。

kblack 绝顶聪明,所以最终他一定会使得他持有的 S 数目 s 最接近 sub,也就是使

|s sub| 最小。在满足这个条件的前提下,他会使他花的丁爷爷币的总数尽可能少。同样是S 热爱者的你现在想知道,kblack 最终持有的 S 数目会是多少,为此他又

会付出多少丁爷爷币呢?

 

【输入格式】

从文件 conscious.in 中读入数据。

本题包含多组数据,第一行一个正整数T ,表示数据组数。接下来依次描述每组数据,对于每组数据:

一行 3 个整数 a, m, sub,分别表示每 1 个丁爷爷币可以买到的 S 数目、东方神秘力量没收 S 的阈值、以及 kblack 潜意识里的数。

 

【输出格式】

输出到文件 conscious.out 中。

对于每组数据,输出一行 2 个用空格隔开的整数,第一个整数表示 kblack 最终持有的 S 数目,第二个整数表示 kblack 会为此付出的丁爷爷币的数目。

 

【样例 1 输入】

2

2 4 3


6 21 15

 

【样例 1 输出】

2 1

15 6

 

【样例 2】

见选手目录下的 conscious/conscious2.inconscious/conscious2.ans

 

【样例 3】

见选手目录下的 conscious/conscious3.inconscious/conscious3.ans

 

【提示】

对于东方神秘力量没收 S 这个设定,kblack 形象地把它描述为莫。

 

【子任务】

对于 10% 的数据,保证 m ≤5,T ≤ 10。对于 20% 的数据,保证 m ≤10。

对于 30% 的数据,保证 m ≤100,T ≤ 100。对于另外 10% 的数据,保证 a =1。

对于 60% 的数据,保证 m ≤20, 000。对于另外20% 的数据,保证 m 为质数。对于 90% 的数据,保证 T ≤10, 000。

对于 100%的数据,保证 2 ≤ m ≤109,1 ≤ a, sub < m,保证 T ≤ 100, 000,

题解:exgcd随便弄一下就行了。

Code:

var
t,i,a,m,sub:longint;
d,l,x,y,k,k1,ans1,ans2:int64;
function exgcd(a,b:int64;var x,y:int64):int64;
var t,d:int64;
begin
if b=0 then
begin
x:=1;y:=0;
exit(a);
end;
d:=exgcd(b,a mod b,x,y);
t:=x;x:=y;
y:=t-(a div b)*y;
exit(d);
end;
begin
assign(input,'conscious.in');reset(input);
assign(output,'conscious.out');rewrite(output);
readln(t);
for i:=1 to t do
begin
readln(a,m,sub);
d:=exgcd(a,m,x,y);
l:=sub mod d;
m:=m div d;
if (sub div d+1)>=m then
begin
k:=sub div d;
ans1:=k*d;
ans2:=((x*k) mod m+m) mod m;
end
else if l+l>d then
begin
k:=sub div d+1;
ans1:=k*d;
ans2:=((x*k) mod m+m) mod m;
end
else if l+l<d then
begin
k:=sub div d;
ans1:=k*d;
ans2:=((x*k) mod m+m) mod m;
end else
begin
k:=sub div d;
k1:=sub div d+1;
if ((x*k) mod m)>((x*k1) mod m) then
begin
ans1:=k1*d;
ans2:=((x*k1) mod m+m) mod m;
end else
begin
ans1:=k*d;
ans2:=((x*k) mod m+m) mod m;
end;
end;
if (ans1-sub)>=sub then
begin
ans1:=0;ans2:=0;
end;
writeln(ans1,' ',ans2);
end;
close(input);close(output);
end.