题面:
解题:
显然,a~b之间的数一个一个枚举着求其重数,数据量大,时间复杂度较高……
相反,已知这些数的特征,我们利用哈希表存储对应数的波浪数重数。
由于波浪数较少,因此,我们可以枚举各进制下的所有波浪数,将其打入哈希表。
三重循环:
for (i=a; i<=b; i++) a到b进制
for (j=1; j<=i-1; j++) 第1个数 不可为0,从1开始
for (k=0; k<=i-1; k++) 第2个数 从0开始
AC代码奉上
#include<iostream>
#include<algorithm>
#define MAXN int(1e7+5)
using namespace std;
int n1, n2, a, b, k; //左、右进制 左、右区间 重数
int p[MAXN] = { 0 };
int main()
{
cin >> n1 >> n2 >> a >> b >> k;
for (int i = n1; i <= n2; i++) //n1进制到n2进制
for (int j = 1; j <= i - 1; j++) //第一个数
for (int k = 0; k <= i - 1; k++)//第二个数
{
if (j == k)continue;
int temp = 0;
for (int l = 0; temp <= b; l++)
{
if (l % 2 == 0)
{
temp = temp * i + j; //进位,并加上第一个数
}
else
{
temp = temp * i + k; //进位,并加上第二个数
}
if (temp >= a && temp <= b) p[temp]++;//表++
}
}
for (int i = a; i <= b; i++)
if (p[i]==k)cout << i << endl;
return 0;
}