HDU6156 Palindrome Function
生活随笔
收集整理的這篇文章主要介紹了
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++)for(ll i=1;;i++){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++)for(ll i=1;;i++){t1 = mmp(i, j, k);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()-1;LL = upper_bound(vec[i].begin(), vec[i].end(), L-1)-vec[i].begin()-1;ans += (RR-LL)*(i-1)+(R-L+1);}printf("Case #%lld: %lld\n", num++, ans);}return 0; }?
轉載于:https://www.cnblogs.com/Noevon/p/7399284.html
總結
以上是生活随笔為你收集整理的HDU6156 Palindrome Function的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017中国大学生程序设计竞赛 - 网络
- 下一篇: leetcode 131. Palind