数位dp

#include <bits/stdc++.h>
using namespace std;
using ll = long long ;
ll x,k,f[20],p[15];
void init(){
    p[0]=1;
    for(int i=1;i<15;i++) p[i]=10ll*p[i-1];
    for(int i=2;i<20;i++) f[i]=9ll*p[i-1>>1];
    f[1]=10;
}
ll dp(ll x){
    if(x>=0&&x<=9)return x+1;
    ll res=0;
    vector<int>v;
    while(x){
        v.push_back(x%10);x/=10;
    }
    int n=v.size();
    ll a=0,b=0;
    for(int i=n-1;i>=n>>1;i--){
        int x=v[i];
        res+=p[i-n/2]*(x-1);
        if(i!=n-1)res+=p[i-n/2];
    }
    for(int i=n/2-1;i>=0;i--){
        b=b*10+v[i];
    }
    for(int i=n+1>>1;i<n;i++){
        a=a*10+v[i];
    }
    if(b>=a)res++;
    for(int i=1;i<n;i++)res+=f[i];
    return res;
}
int main()
{
    init();
    cin>>x>>k;///x往后第k个回文
    ll y=dp(x-1)+k;///多少个小于x的回文数
    ll l=1,r=1e18;
    while(l<r){
        ll mid=l+r>>1;
        if(dp(mid)>=y)r=mid;
        else l=mid+1;
    }
    cout<<l;
    return 0;
}

 

posted @ 2021-06-21 18:35  Acception  阅读(36)  评论(0)    收藏  举报