题目描述
波浪数是在一对数字之间交替转换的数,如12121211212121,双重波浪数则是指在两种进制下都是波浪数的数,如十进制数191919191919是一个十进制下的波浪数,它对应的十一进制数121212121212也是一个波浪数,所以十进制数191919191919是一个双重波浪数。
类似的可以定义三重波浪数,三重波浪数在三种不同的进制中都是波浪数,甚至还有四重波浪数,如十进制300=606300=606(七进制)=363363(九进制)=454454(八进制)=1A11A1(十三进制)…,你的任务就是在指定范围内找出双重、三重、四重波浪数。
输入输出格式
输入格式
单独一行包含五个用空格隔开的十进制整数,前两个数表示进制的范围(2-322−32),第三与第四个数表示指定的范围(1-100000001−10000000),第五个数为2,3,42,3,4中的一个,表示要找的波浪数的重数。
输出格式
从小到大以十进制形式输出指定范围内的指定重数的波浪数。一行输出一个数。
输入输出样例
输出样例
191919
383838
575757
767676
959595
题解
先将每种进制的波浪数构建出来,然后暴力统计其十进制形式的出现次数,最后暴力枚举波浪数十进制形式的范围来判断是否为出现次数符合的波浪数。

#include <iostream> #define MAX_NUM 10000005 using namespace std; int min1, max1, min2, max2, K; int a[MAX_NUM]; int main() { cin >> min1 >> max1 >> min2 >> max2 >> K; for(register int i = min1; i <= max1; ++i) { for(register int j = 1; j < i; ++j) { for(register int k = 0, tmp = 0, bit = 0; k < i; ++k, tmp = bit = 0) { if(j ^ k) { while(tmp <= max2) { tmp = (bit & 1 ? tmp * i + k : tmp * i + j); ++bit; if(tmp >= min2 && tmp <= max2) ++a[tmp]; } } } } } for(register int i = min2; i <= max2; ++i) { if(a[i] ^ K) continue; cout << i << endl; } return 0; }