思想: 枚举比S大的数i,如果说i转二进制到10进制至少满足有种进制是回文进制,那么就输出,如果输出了N个i,那么就break掉。
#include<bits/stdc++.h>
using namespace std;
int N,S,cnt,sum1,sum2,kind;
vector<int>v1,v2;
//检查传入的i的某种进制是否是回文进制
bool jin(int x,int D)
{
sum1=0,sum2=0;
v1.clear();v2.clear();
int temp=x;
while(temp)
{
v1.push_back(temp%D);
temp/=D;
}
v2=v1;
for(auto& it:v1)sum1=sum1*10+it;
reverse(v2.begin(),v2.end());
for(auto& it:v2)sum2=sum2*10+it;
if(sum1==sum2)return true;
return false;
}
//检查i从 2进制到 10进制 中是否满足 至少有2种进制是回文进制。
bool check(int x)
{
kind=0;
for(int D=2;D<=10;D++)
{
if(jin(x,D))
{
kind++;
}
}
if(kind>=2)return true;
return false;
}
//输出大于S的N个满足至少2种进制的数i
void sovel()
{
cin>>N>>S;
for(int i=S+1;;i++)
{
if(check(i))
{
cout<<i<<endl;
cnt++;
}
if(cnt==N)
{
break;
}
}
}
int main()
{
int t=1;
while(t--)
sovel();
return 0;
}