潜意识

潜意识(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.

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jack-Oran

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值