HDU6156 Palindrome Function

Posted 2855669158

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU6156 Palindrome Function相关的知识,希望对你有一定的参考价值。

题意:输入L,R,l,r求[L,R]范围内在[l, r]进制下的回文数(2<=l<=r<=26, L<=R<1e9)

题解:主要是求回文数,枚举每个进制,求ans = R前面的回文数-L前面的回文数,可以发现每个进制下小于1e9的回文数比较少,直接把所有的回文数预处理排序二分就可以

#include <bits/stdc++.h>
#define ll long long
#define maxn 100100
#define BUG(x, n) for(ll i=0;i<=n;i++) cout<<x[i]<<" ";cout<<endl;
using namespace std;
ll temp[100];
vector<ll >vec[40];
ll mmp(ll x,ll t,ll k){
    ll num=0, ans = 0;
    while(x){
        temp[++num] = x%t;
        x /= t;
    }
    for(ll i=num;i>=1;i--) ans = ans*t+temp[i];
    if(k!=-1) ans = ans*t+k;
    for(ll i=1;i<=num;i++) ans = ans*t+temp[i];
    return ans;
}
void init(){
    ll t1 = 0;
    for(ll i=2;i<=36;i++)
        for(ll j=0;j<i;j++)
            vec[i].push_back(j);
    for(ll j=2;j<=36;j++){
        ll i = 1;
        while(1){
            t1 = mmp(i, j, -1);
            if(t1>1e9) break;
            vec[j].push_back(t1);
        }
    }
    for(ll j=2;j<=36;j++)
        for(ll k=0;k<j;k++){
        ll i = 1;
        while(1){
            t1 = mmp(i, j, -1);
            if(t1>1e9) break;
            vec[j].push_back(t1);
        }
    }
    for(ll i=2;i<=36;i++) sort(vec[i].begin(), vec[i].end());
}
int main(){
    init();
    ll T, L, R, l, r, ans, RR, LL, num = 1;
    scanf("%lld", &T);
    while(T--){
        ans = 0;
        scanf("%lld%lld%lld%lld", &L, &R, &l, &r);
        for(ll i=l;i<=r;i++){
            RR = upper_bound(vec[i].begin(), vec[i].end(), R)-vec[i].begin();
            LL = upper_bound(vec[i].begin(), vec[i].end(), L-1)-vec[i].begin();
            ans += (RR-LL)*(i-1)+(R-L+1);
        }
        printf("Case #%lld: %lld\n", num++, ans);
    }
    return 0;
}

 

以上是关于HDU6156 Palindrome Function的主要内容,如果未能解决你的问题,请参考以下文章

HDU6156 Palindrome Function

数位DPHDU 6156 Palindrome Function

[HDOJ6156] Palindrome Function(数位dp, 枚举)

2017 ccpc 网络赛 hdu 6156

HDU 6156

HDU 6156 回文 数位DP(2017CCPC)