1 条题解
-
0
自动搬运
来自洛谷,原作者为

白烛葵
**搬运于
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
- 上传者