风灵无畏OI

此站用来记录个人的OI成长史,以后会将个人做的每道题的解题报告发到此站上来,希望大家喜欢!(如有讲得不好的地方请大家指出,我会加以改进。当然也有可能传上来一点乱七八糟的东西)
注:转载文章请标上原址,毕竟码字很辛苦!谢谢!

MDZX高一第四次欢乐模拟赛——三巨头的二进制

https://pyoj.ml/problem/63

【题目描述】

众所周知,三巨头是明德中学信息奥赛中最有潜力的三位大佬,当我们还在玩泥巴的时候,他们已经会二进制了,现在,他们丢给了你这么一个问题。

三巨头创造了一种新的进制,叫做巨头进制,巨头进制转为十进制的计算方式是

∑ki=0(−1)i∗2i∗a[i]∑i=0k(−1)i∗2i∗a[i]

其中a[i]为该数在巨头进制下第i位的数,且a[i]∈{0,1}。

现在,三巨头给了你一个十进制数x,问你能否用巨头进制表示这个数。

【输入格式】

输入的第一行有一个整数 n,表示数据组数。

接下来n行,每行两个整数k,x,含义见题目描述。

 【输出格式】  

输出包括 n 行,每行一个字符串表示答案,如果x能被表示成巨头进制,则输出“YES”(不包含引号),否则输出“NO”(不包含引号)。

 【样例数据】

input1

2

2 2

1 2

output1

YES

NO

input2

2

16 602368

17 7018

output2

NO

YES

【数据范围与约定】

  • 对于50%50%的数据,k≤20k≤20,

  • 对于80%80%的数据,k≤40k≤40,

  • 对于100%100%的数据,n≤200000,k≤60,x≤1018n≤200000,k≤60,x≤1018.

【时间限制】

1s空间限制:512MB

【题目分析】

       做这道题,其实弄清楚两个东西就好了。一个是模运算,另一个是负进制数。下面给出这两个相关内容的讲解(百度百科):

模运算:https://baike.baidu.com/item/负进制数

负进制数:https://baike.baidu.com/item/模运算

      模运算的这篇,大家其实只要看这两个东西即可:

1 Turbo Pascal对mod的解释是这样的:

    A Mod B=A-(AdivB) * B (div含义为整除)[1] 

2 n % p得到结果的正负由被除数n决定,与p无关。例如:

      7%4 = 3, -7%4 = -3, 7%-4 = 3, -7%-4 = -3

   (在java、C/C++中%是取余,在python是模运算,此处%按取余处理)。

负进制数的那篇都看看就好。

     再回到本题上,你会发现,这就是看那个x能不能转换成一个负二进制数,而代码,刚刚百度百科上已经给出了。

【程序代码】

var  n,p,k,top,x:int64;

     i:longint;

begin

  readln(n);

  for i:=1 to n do

   begin

     readln(k,x); top:=-1;

     while x<>0 do

      begin

        inc(top);

        if top>k then break;

        p:=x mod -2; x:=x div -2;

        if p<0 then inc(x);

      end;

      if top<=k then writeln('YES') else writeln('NO');

   end;

end.

【解后反思】

        其实有些东西,靠平时自己的积累,你做得多了,对某些东西掌握越熟,对你就越有益。所以,就像锟哥大神说的那样,多做题就好了哈。

【特别鸣谢】

      感谢为本次考试出题的PB大佬!!!您永远是我们的红太阳!!!

评论

© 风灵无畏OI | Powered by LOFTER