题目描述
波浪数是在一对数字之间交替转换的数,如12121211212121,双重波浪数则是指在两种进制下都是波浪数的数,如十进制数 191919191919 是一个十进制下的波浪数,它对应的十一进制数 121212121212 也是一个波浪数,所以十进制数 191919191919 是一个双重波浪数。
类似的可以定义三重波浪数,三重波浪数在三种不同的进制中都是波浪数,甚至还有四重波浪数,如 300(10)=606(7)=363(9)=454(8)=1�1(13)300(10)=606(7)=363(9)=454(8)=1A1(13),下标表示采用的进制。你的任务就是在指定范围内找出双重、三重、四重波浪数。
输入格式
单独一行包含五个用空格隔开的十进制整数 �,�,�,�,�l,r,L,R,k。[�,�][l,r] 表示应当考虑的进制的范围,[�,�][L,R] 表示应当考虑的数字的范围,�k 表示你应该找的波浪数的重数。
输出格式
从小到大以十进制形式输出指定范围内的指定重数的波浪数。一行输出一个数。
输入输出样例
输入 #1复制
10 11 190000 960000 2
输出 #1复制
191919 383838 575757 767676 959595
说明/提示
数据范围及约定
对于全部数据,保证 2≤�≤�≤322≤l≤r≤32,1≤�≤�≤1071≤L≤R≤107,�∈{2,3,4}k∈{2,3,4}。
老师出了一张pj模拟卷
第二题就是这玩意。。。。
考场上的我一看到进制转换就瘫了。。。。。
考完之后才又去写了一遍
发现它的核心思想并不是题目所说的那样去判断不同进制的“波浪”
逆向思维一下
其实我们应该先生成所给范围内的波浪数
(就是把每个波浪数打出来存进一个装‘重数’的数组里)
然后直接遍历数组输出想要的重数的数就行啦
这样不仅不会超时而且代码也更容易实现
(咋考试时就想不到呢。。。。。。)
本人拙码:
#include<bits/stdc++.h>
using namespace std;
int a,b,l,r,c,t,x;
int v[10000005];//存储重数
int main(){
memset(v,0,sizeof(v));
scanf("%d%d%d%d%d",&a,&b,&l,&r,&c);
for(int k=a;k<=b;++k){
for(int i=1;i<k;++i){
for(int j=0;j<k;++j){
if(i!=j)//不能是相同的数波浪
{
x=0;
t=0;
while(x<=r){
if(t%2==0){
x=x*k+i;
++t;
}
else{
x=x*k+j;
++t;
}
if(x>=l&&x<=r) ++v[x];
}
}
}
}
}
for(int i=l;i<=r;++i){
if(v[i]==c) printf("%d\n",i);
}
}