TopCoder SRM 302 Div1 Medium IntegerPalindrome

問題

正の整数が回文であるとは、整数を逆から読んでも同じであることを言う。
ただし、leading zeroはあってはならない。
(12321は回文であるが、123210は回文ではない)


K番目(0-indexed)に小さな回文である正の整数を求めよ。

制約条件

K≦1000000000

方針

1桁の回文は9個、2桁の回文も9個、
3桁の回文は90個、4桁の回文も90個、
……


となるので、
まずは何桁の何番目の回文であるかを求めて、
その後具体的に回文を作ればいい。

ソースコード

class IntegerPalindrome {
	public:
	long long findByIndex(int K) 
	{
		ll cnt=9, pw[30];
		pw[0]=1;
		rep(i,29)pw[i+1]=pw[i]*10;
		
		for(int i=1;;i++){
			if(K>=cnt)K-=cnt;
			else{
				K+=pw[i-1];
				stringstream ss;
				ss<<K;
				if(K/10)ss<<K/10;
				string s=ss.str();
				if(s.size()>1)reverse(s.begin()+s.size()/2+1,s.end());
				return atoll(s.c_str());
			}
			if(K>=cnt)K-=cnt;
			else{
				K+=pw[i-1];
				stringstream ss;
				ss<<K<<K;
				string s=ss.str();
				reverse(s.begin()+s.size()/2,s.end());
				return atoll(s.c_str());
			}
			cnt*=10;
		}
	}
};