<-既然来了赠人玫瑰手有余香
一看这道题数据范围大的快上天了,其实不然。
并不难,就是在于逆向思维。
如果循环枚举$x,y$之间的所有数,看是否是“有趣的数”,那么肯定是行不通的,会超时。
那怎么办呢?
我们就可以换一个角度想,因为“有趣的数”并不多,所以我们可以先枚举出每一个“有趣的数”,最后判断区间$(x,y)$之间有几个“有趣的数”即可。
不开long long见祖宗
枚举的层次:
数字长度->构造一个各位全部相同的数字->新的数字k,判重并改字符->统计答案
#include <bits/stdc++.h>
using namespace std;
long long x, y, ans = 0;
int main() {
cin >> x >> y;
for (int i = 3; i <= 17; i++) { //数字长度
for (int j = 0; j <= 9; j++) { //相同的数字
string str(i, '0' + j); //先构造一个全部相同的数字
for (int k = 0; k <= 9; k++) { //新数字k
if (j == k) continue; //判重
for (int o = 0; o < i; o++) {
str[o] = '0' + k; //加入“错误字符”
long long p = 0;
for (int q = 0; q < i; q++) p = p * 10 + (str[q] - '0');
if (str[0] != '0' && x <= p && p <= y) ans++;
str[o] = '0' + j; //一定要记住还原现场,当时就被坑了……
}
}
}
}
printf("%lld\n", ans);
return 0;
}
不懂的请留言评论区
路过的大佬们有时间帮忙解决一下,面临毕业考忙不过来,没时间上线
大佬好强orz
请问一下 ,y总说最多有 17109*17 ,这个是怎么来的,y总的没听懂
17*10*9*17
吗是什么最多有这么多呀,而且我还没听y总思路,可能不是很理解您在问什么
我那个明白了,哈哈。感谢大佬的回复
ok
学到了谢谢大佬
谢谢资瓷!
学到了,谢谢大佬
谢谢资瓷!
大佬,if (str[0] != ‘0’) 这里不太理解,如果一开始构造了”000000”,然后改成”010000”,这个不算”有趣的数”吗?
懂了,与”10000”重复了
ok
但是这应该不会出现吧,010000只有一次出现
其它的应该也无法构造出剩下10000的情况
谢谢大佬
加油!
十年OI一场空,不开long long见祖宗
hh当时就被坑了
这个
string str(i, '0' + j);
是一个构造函数吗,用法是什么还想问问为什么枚举位置的时候不能
<=i
呢因为str的长度是i, 下标是0~i -1, =i就越界了
意思是构造一个字符串$str$,长度为i,并且把每一位都赋值为j这个数(但是在这里要转化为字符形式)
对,谢谢大佬帮忙解答!