题解 CF887A 【Div. 64】

· · 题解

CF887A Div. 64 题解

=

写在前面的闲话

-

您现在正在收看的是蒟蒻jch的题解

蒟蒻感觉这题明显恶评啊,是黄题

虽然这是道红题,但本蒟蒻还是控制不住篇幅,写的挺长(对于红题来说),可能会占用您的时间,请谅解(逃

本蒟蒻的第二篇题解,求支持qwq

正题开始!

-

这题大意就是给一个二进制串,问能否在串中删一些数,使得这个串能被十进制中的64整除。

很容易发现,只要是能删成十进制中的64(2^6),也就是二进制中的1000000,因为64能被64整除,所以这个串也能被64整除。

这题其实已经做完了,但为了逻辑的严谨性(我经常提到这点)(路人:啊你不是说这是第二篇题解么 本菜鸡:@#¥%&*!……),我们还要证明不满足这个条件的就不行。

丑陋而啰嗦华丽丽的证明过程:

其实很多神仙们应该早就反应过来为毛了,但为了刷题解长度照顾装弱装到我那么菜的巨佬们,我还是写一下吧。

要使得这个串能删成1000000,有3个条件:

   1.有1个1;

   2.有6个0; 

   3.0在1的右边;

所以,我们对每一个条件,逐一分析不满足的情况:

不满足情况1,只有一种可能,那就是0,根据题意,0要输出的是no(别问窝为神马,我就这么错过一次,错了的提交记录 in CF

ps:以上有2个链接

不满足情况2和3,用的是同一种证明方法。

能被64整除的二进制串,最小的是1000000,其次是10000000,11000000……不删成100000,只能删成这些数。而它们在十进制中是64,128,172……可以看到,两个数列都是等差数列,公差为64,也就是二进制中的100000。因此,这个数的后6位一开始是0,后来又不断加0,无论如何只能是0,换句话说,1的后面必须有6个0。也就是说,必须要有6个0,且0在1右边,才能满足要求。因此,不满足条件2或3,也不能删成能被64整除的数。

于是,我们得出了这题的证明过程。

所以,这题的做法,就是看能否在1后面找到6个0,可以就输出yes,不可以就输出no,就????了。

最近有一次考试,因为码风的问题掉了很多分,被批了,因此痛改前非,什么bits啥的统统用上,int main里的括号不写void了,register,short,string,cin优化啥的都不用了,常用的cin,cout也改成了scanf,就是热衷的压行还没有丢(老师也压行)。感觉码风的转变还是挺五味杂陈的,虽然我是强迫症,可以在好几种码风同时切换(捂嘴)

你们最爱的——求点赞关注上代码qaq:

//老套路,(虽然这只是我的第二篇题解)建议的阅读程序顺序:头文件区(自己编的)->主程序->主程序顺序下的子函数
#include<bits/stdc++.h>//最近也改成了万能库
using namespace std;
bool flag=false;//记录第一个1 (此题不能不管1,虽然非零的2进制数一定以1开头,但不能落掉1,否则会WA(本蒟蒻的惨痛经历))
int cnt=0;//记录0的个数
char t[110];//输入的二进制串
int main()
{
    scanf("%s",t+1);//读入字符串(废话),本菜鸡习惯从1开始存
    int len=strlen(t+1);//字符串的长度,注意从1开始存要加1
    for(int i=1;i<=len;++i)//扫一遍整个字符串
    {
        if (t[i]=='1') flag=true;//如果找到1,打上标记
        if (flag&&t[i]=='0') ++cnt;//在找到1时再统计0的个数
        if (cnt==6) {printf("yes\n");return 0;}//找完6个0就OK
    }
    printf("no\n");//没找到就失败
    return 0;//功德圆满
}

/*

100010001

yes

100

no */

ps:某ZJ菜鸡喜欢在代码后面粘样例

因为Ctrl + C= c t r l c=chang tiao rap lanqiu caixukun=唱跳rap篮球蔡徐坤;因此,代码在此,切勿copy!

写在最后

- 我还是喜欢给CF的题写题解,不知道是为毛,难道是因为崇洋媚外,卖国求荣你谷上做的人少?

呼,终于写完了

呼,终于看完了

题解就到这里,再次感谢您的时间,如有不当之处请私信或在此留言,拜拜qaq!

谢谢管理员大大的审理qwq

The end.