http://begin.lydsy.com/JudgeOnline/problem.php?id=1129
和大佬不一样,用数数做的。
首先 任何一个回文数,都可以分解成两位组合1位的形式。然后从边缘递归。
注意最外层要从1开始。
然后 就开始数数。
比如5 位数等于2位数乘上3位数的个数。这里的三位数是包含010 000的 。
然后 这样数着进行递归。
用p记录没有限制的数量,d记录有限制的数量。
然后把整个数列分治成 2 *1 形式。
#include <bits/stdc++.h>
using namespace std;
long long d[20];
long long p[20];
string a[11]={"0","1","2","3","4","5","6","7","8","9"};
string b[10000]={"00","11","22","33","44","55","66","77","88","99"};
void bfs(int t,int s,int l)
{
int y=t-2;
if(t>=2)
{
for(int i=l;i<10;i++)
{
if(s<=p[y])
{
cout<<b[i][0];
bfs(t-2,s,0);
cout<<b[i][1];
return ;
}
s-=p[y];
}
cout<<b[s-!l];//若是起始元素,则开头是从1开始,若不是起始元素,开头从0开始。
}
else
cout<<a[s-!l];
}
int main()
{
d[1]=d[2]=9;
p[1]=p[2]=10;
for(int i=3;i<20;i++)
{
p[i]=p[2]*p[i-2];
d[i]=d[2]*(p[i-2]);
}
int n;
while(cin>>n&&n)
{
for(int i=1;i<=30;i++)
{
if(n>d[i]) n-=d[i];
else
{
bfs(i,n,1);
cout<<endl;
break;
}
}
}
}