原题连接
一道很咋呼但其实并不难的一道题。
这个题的主要方法是构造。枚举是绝对要超时的,想都不要想 。
我们逆向出发,构造出所有的波浪数。
代码+注释:
#include<iostream>
using namespace std;
int num[10000005];
int a, b, l, r, c;
int main()
{
cin >> a >> b >> l >> r >> c;
//a,b是进制,l,r是边界,c是重数
for (int i = a; i <= b; i++) {
//从a进制开始,枚举到b进制,找出所有的波浪数
for (int j = 1; j < i; j++) {
//这里的i,j是形成波浪的两个数
//显然,i!=j而且i,j<i
for (int k = 0; k < i; k++) {
if (j != k) {
int x = 0, t = 0;
while (x <= r) {
if (t % 2 == 0) {
x = x * i + j;
t++;
}
else {
x = x * i + k;
t++;
}
if (x >= l && x <= r)
num[x]++;
}
}
}
}
}
for (int i = l; i <= r; i++)
if (num[i] == c)
cout << i << endl;
return 0;
}