【題解】Luogu P1207 【[USACO1.2]双重回文数 Dual Palindromes】

请注意:此方法当且仅当编译器支持C++11及以上标准时即可食用,NOIP/NOI等竞赛编译器默认不打开C++11支持。

模拟,辅助函数:

①转进制:用stl的栈和string实现(其实只用string实现就可以了。。。。)

②判断回文:读入一个string,再创建这个string的副本,然后将副本反转(stl的reverse()函数),最后判断是否相等即可

主函数:用k来记录进制数,用x来记录个数,模拟即可

详细C++11的函数的调用处请看代码(话说C++11真好用2333)

#include<cstdio>
#include<string>
#include<iostream>
#include<stack>
#include<algorithm>

using namespace std;

stack<int> s;

string changeSys(int num,int sys){
    do{
        s.push(num % sys);
        num /= sys;
    }while(num != 0);

    string ans = "";
    while(s.size()){
        ans += to_string(s.top());//to_string()当且仅当C++11下可用,可以将int/double/long long等类型转换为string类型 
        s.pop();
    }

    return ans;
}

bool isPal(string s){
    string ss = s;
    reverse(ss.begin(),ss.end());

    return ss == s ? true : false;
}

int main(){
    int n,s;
    scanf("%d %d",&n,&s);

    int k = 0,x = 0;
    for(int i = s + 1;i <= 666666;i++){
        for(int j = 2;j <= 10;j++){
            if(isPal(changeSys(i,j))){
                k++;
            }
        }

        if(k >= 2 && x < n){
            printf("%d\n",i);
            x++;
        }

        if(x == n){
            break;
        }

        k = 0;
    }

    return 0;
}