【链接】http://acm.hdu.edu.cn/showproblem.php?pid=6156


【题意】


已知函数f(x, k),如果10进制数x在k进制下是个回文数,那么f(x, k)值为k,否则为1

现给出l, r, x, y, 求出∑∑f(i, j)  (l<=i<=r)  (x<=j<=y)


【题解】


如果会求10进制的回文数个数问题的话,多少进制都能求了.
在这个程序的基础上把十进制改成base进制就好
剩下的不难写

【错的次数】


0

【反思】


在这了写反思

【代码】

#include <bits/stdc++.h>
#define int long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define ri(x) scanf("%d",&x)
#define rl(x) scanf("%lld",&x)
#define rs(x) scanf("%s",x+1)
#define oi(x) printf("%d",x)
#define ol(x) printf("%lld",x)
#define oc putchar(' ')
#define os(x) printf(x)
#define all(x) x.begin(),x.end()
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0)
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
using namespace std;
const int MAXN = 110; int dp[40][MAXN][MAXN][2];
int num[MAXN],temp[MAXN],base;
int dfs(int start,int cur,bool state,bool f)
{
    if(cur<0) return state;
    if(!f&&dp[base][start][cur][state]!=-1)
        return dp[base][start][cur][state];
    int en=f?num[cur]:base-1;
    int ans=0;
    for(int i=0;i<=en;i++)
    {
        temp[cur]=i;
        if(start==cur&&i==0)
        {
            ans+=dfs(start-1,cur-1,state,f&&i==en);
        }
        else if(state&&cur<(start+1)/2)
        {
            ans+=dfs(start,cur-1,temp[start-cur]==i,f&&i==en);
        }
        else
        {
            ans+=dfs(start,cur-1,state,f&&i==en);
        }
    }
    if(!f&&ans>=0)
        dp[base][start][cur][state]=ans;
    return ans;
}
int f(int n)
{
    int len=0;
    while(n)
    {
        num[len++]=n%base;
        n/=base;
    }
    num[len]=0;
    return dfs(len-1,len-1,1,1);
}
main()
{
    ios::sync_with_stdio(false);
    int t;
    cin >> t;
    memset(dp,-1,sizeof dp);
    int cas = 0;
    while(t--)
    {
        int L,R,l,r;
        cin >> L >> R >> l >> r;
        int ans = 0;
        for (base = l;base <= r;base++)
        {
            int num = f(R)-f(L-1);
            ans = ans + (num)*base;
            ans = ans + R-L + 1 - num;
        }
        cout << "Case #" << ++cas <<": "<<ans<<endl;
    }
    return 0;
}

最新文章

  1. MaxTemperature程序Mapper ClassNotFoundException
  2. BZOJ 4517: [Sdoi2016]排列计数
  3. POJ 1006 中国剩余定理
  4. js第一天
  5. Android Https
  6. solr默认查询设置
  7. 第4条:多用类型常量,少用#define预处理指令
  8. 树状数组(二维):COGS 1532 [IOI2001]移动电话
  9. API之IP地址查询---权威的IP地址查询接口集合
  10. mysql distinct、group_concat
  11. Egret学习笔记 (Egret打飞机-3.实现背景循环滚动)
  12. SpringMVC云题库错题及答案汇总-2
  13. 20135323符运锦----第七周:Linux内核如何装载和启动一个可执行程序
  14. HDFS namenode 写edit log原理以及源码分析
  15. SonarQube配置LDAP认证集成
  16. 微信小程序之可滚动视图容器组件 scroll-view
  17. 自己写的jQuery浮动广告插件
  18. bzoj 4871: [Shoi2017]摧毁“树状图”
  19. network出错
  20. redhat6.7在线安装postgresql9

热门文章

  1. h5 图片回显
  2. poj--3281-- DiningI(最大流)
  3. HtmlHelper的扩展分页方法
  4. POJ 3265 DP
  5. 二分法查找 js 算法
  6. 动态调用WebService-获取天气
  7. 如何解决winxp访问win10共享打印机提示凭据不足
  8. java关于File.separator
  9. 彻查网络局部网段内Ping时断时续的问题
  10. android 动画xml属性具体解释