1 条题解

  • 0
    @ 2025-8-24 21:27:41

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 白烛葵
    **

    搬运于2025-08-24 21:27:40,当前版本为作者最后更新于2018-11-06 18:52:38,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    下方高能暴力

    作为一个蒟蒻,看到这题1e9的数据范围,铁定是数论QWQ

    然后死活推不出公式

    之后我写了个模拟程序,跑了一下,打了个表,想找公式。。。

    然而除了发现在5e7的范围内不会TLE,以外啥都没发现

    我去,要是这题数据在5e7以内就好

    对啊,要是在5e7内就好了。。。

    于是,一种神奇的暴力算法出现了QWQ

    完全不知道这种想法是怎么冒出来的

    就是既然数据范围是1e9

    那我就把范围强行压到5e7里

    具体操作就是,将1e9分成20个5e7,也就是在场外打表

    用暴力算出端点的传递方向和当前是谁报数

    再写20个if语句,找出n属于20个区域中的哪一个,在进行模拟求算就行了

    这样范围就很好的被我们压在5e7中

    最为纯粹的暴力啊。。。

    模拟写的好的话,跑1e9只要19s,表很快就打出来了

    下面上代码

    #include<cstdio>
    using namespace std;
    int n,i,j,k,t,pd,m;
    int ha(int x,int y,int z,int a)
    //模拟函数,x代表区域端点,y代表n,z是当前在哪个人,a表示如何传递方向
    {
        t=z;
        for(i=x;i<=y;i++)
        {
            t+=a;//a有两值,1和-1,这样就不用每次判定浪费时间
            if(i%7==0)
            a=-a;//是7的倍数就变方向
            else
            {
                k=i;
                while(k)//还有含有7的数也要变
                {
                    if(k%10==7)
                    {a=-a;break;}
                    k/=10;
                }
            }
            if(t==0)t=1337;
            if(t==1338)t=1;//界限规定
        }
        printf("%d",t);//答案
    }
    int main()
    {
        //freopen("a.in","r",stdin);
        //freopen("seven.out","w",stdout);
        scanf("%d",&n);
        //下面是最暴力毒瘤的程序,20个if划分区域QWQ
        if(n<5e7){ha(1,n,0,1);}
        //分别对区域进行划分,跑5e7的模拟
        else if(n<1e8){ha(5e7,n,157,-1);}
        else if(n<1e8+5e7){ha(1e8,n,547,1);}
        else if(n<2e8){ha(1e8+5e7,n,346,-1);}
        else if(n<2e8+5e7){ha(2e8,n,867,-1);}
        else if(n<3e8){ha(2e8+5e7,n,892,1);}
        else if(n<3e8+5e7){ha(3e8,n,893,-1);}
        else if(n<4e8){ha(3e8+5e7,n,1212,-1);}
        else if(n<4e8+5e7){ha(4e8,n,63,1);}
        else if(n<5e8){ha(4e8+5e7,n,893,-1);}
        else if(n<5e8+5e7){ha(5e8,n,1302,-1);}
        else if(n<6e8){ha(5e8+5e7,n,1055,1);}
        else if(n<6e8+5e7){ha(6e8,n,98,-1);}
        else if(n<7e8){ha(6e8+5e7,n,957,1);}
        else if(n<7e8+5e7){ha(7e8,n,1279,-1);}
        else if(n<8e8){ha(7e8+5e7,n,1279,-1);}
        else if(n<8e8+5e7){ha(8e8,n,1279,-1);}
        else if(n<9e8){ha(8e8+5e7,n,143,1);}
        else if(n<9e8+5e7){ha(9e8,n,959,1);}
        else if(n<=1e9){ha(9e8+5e7,n,934,-1);}
        //说一下那个n<=1e9的等于,一开始我没写也对了,因为最大数据点好像不是1e9
        return 0;
    }
    

    这暴力方法是不是很厉害毒瘤QWQ

    一道蓝色数论就这么轻松切掉

    所以暴力就要敢想,敢写,脑洞大开,你永远不会知道

    暴力到底有多少种神奇的用法

    如果你认可我的思路的话

    请点赞,关注,投币,素质三连,谢谢支持QWQ

    • 1

    信息

    ID
    654
    时间
    1000ms
    内存
    125MiB
    难度
    5
    标签
    递交数
    0
    已通过
    0
    上传者