http://acm.hdu.edu.cn/showproblem.php?pid=6156

题意:
$f(n,k)$表示判断n在k进制下是否是回文串,如果是,则返回k,如果不是,则返回1。现在要计算$\sum_{i=L}^{R}\sum_{j=l}^{r}f(i,j)$。

思路:
因为我不会数位dp,所以我直接模拟做了一发,写得十分繁琐。。。

先是将数转换成k进制,然后去计算出它的前一半的数,只要小于该数那都是成立的 ,比如说现在前面的数为985,那么1~984的数都是满足的,绝对不会超。

思路大致就是这样,具体的话还有一些细节,请参见代码。

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn=+;
const int mod=1e9+; ll L,R;
int l,r;
int dig[]; ll solve(ll n, int k)
{
if(n==) return ;
int len=;
ll tmp=n;
while(tmp)
{
dig[++len]=tmp%k;
tmp/=k;
}
ll num=;
if(len&) //奇数位
{
if(len>=)
{
ll base=;
for(int i=len/+;i<=len;i++)
{
num+=dig[i]*base;
base*=k;
}
num--; //除去本身,1~num-1的数都是可行的
num*=k; //奇位数的时候中间那位数可以自由选择
base=; ll tmp=;
for(int i=;i<=len/;i++) //奇数位下偶数的情况,前面计算的都是奇位数的情况
{
tmp+=(k-)*base; //直接算最大值即可
base*=k;
}
num+=tmp;
num+=k-; //再加上一位数的情况,因为这个前面没有计算
}
else num=dig[];
}
else //偶数位
{
ll base=;
for(int i=len/+;i<=len;i++)
{
num+=dig[i]*base;
base*=k;
}
num--;
base=; ll tmp=;
if(len>) //偶数位下奇位数的情况
{
for(int i=;i<=len/-;i++)
{
tmp+=(k-)*base;
base*=k;
}
tmp*=k;
num+=tmp;
}
num+=k-;
} ll cnt1=,cnt2=;
//判断前一半的数和当前前一半数相等时的情况
if(len&)
{
if(len>=)
{
ll base=;
int zero=;
for(int i=len;i>=len/+;i--)
{
cnt1+=dig[i]*base;
if(dig[i]==) zero++; //特别注意,排除前导0
if(zero==len-i+) continue;
base*=k;
}
base=;
for(int i=;i<=len/;i++)
{
cnt2+=dig[i]*base;
base*=k;
}
int zhong=dig[len/+];
if(cnt1<=cnt2) num+=zhong+;
else num+=zhong;
}
}
else
{
ll base=;
int zero=;
for(int i=len;i>=len/+;i--)
{
cnt1+=dig[i]*base;
if(dig[i]==) zero++;
if(zero==len-i+) continue;
base*=k;
}
base=;
for(int i=;i<=len/;i++)
{
cnt2+=dig[i]*base;
base*=k;
}
if(cnt1<=cnt2) num++;
}
return k*num+(n-num);
} int main()
{
//freopen("in.txt","r",stdin);
int T;
int kase=;
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld%d%d",&L,&R,&l,&r);
ll ans=;
for(int k=l;k<=r;k++)
{
ans+=solve(R,k)-solve(L-,k);
}
printf("Case #%d: %lld\n",++kase,ans);
}
return ;
}

HDU 6156 Palindrome Function的更多相关文章

  1. HDU 6156 - Palindrome Function [ 数位DP ] | 2017 中国大学生程序设计竞赛 - 网络选拔赛

    普通的数位DP计算回文串个数 /* HDU 6156 - Palindrome Function [ 数位DP ] | 2017 中国大学生程序设计竞赛 - 网络选拔赛 2-36进制下回文串个数 */ ...

  2. 【数位DP】HDU 6156 Palindrome Function

    http://acm.hdu.edu.cn/showproblem.php?pid=6156 [AC] #include<bits/stdc++.h> using namespace st ...

  3. HDU 6156 Palindrome Function(数位DP)题解

    思路: 数位dp的操作是dfs+记忆化,我们dp开四维:位置,长度,进制,是否回文.然后每次暴搜记录下每个位置的数字是什么,搜到对称轴另一边需要检查是否符合回文. 终于把友谊赛的题目都补完了...没做 ...

  4. HDU - 6156 2017CCPC网络赛 Palindrome Function(数位dp找回文串)

    Palindrome Function As we all know,a palindrome number is the number which reads the same backward a ...

  5. hdu 1159 Palindrome(回文串) 动态规划

    题意:输入一个字符串,至少插入几个字符可以变成回文串(左右对称的字符串) 分析:f[x][y]代表x与y个字符间至少插入f[x][y]个字符可以变成回文串,可以利用动态规划的思想,求解 状态转化方程: ...

  6. HDU 6156 数位dp

    Palindrome Function Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Ot ...

  7. HDU 6156 回文 数位DP(2017CCPC)

    Palindrome Function Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Ot ...

  8. HDU 6050 - Funny Function | 2017 Multi-University Training Contest 2

    /* HDU 6050 - Funny Function [ 公式推导,矩阵快速幂 ] 题意: F(1,1) = F(1, 2) = 1 F(1,i) = F(1, i-1) + 2 * F(1, i ...

  9. Palindrome Function HDU - 6156(数位dp)

    要求m-n内在l-r进制下的是回文数的总个数. dp[进制][从第j为开始][目前到达第k位] = 总的方案数 dfs枚举目前的到达的位置,这个数开始的位置,进制,前导零,限制条件,然后枚举的时候如果 ...

随机推荐

  1. Rufus 制作 USB 启动盘简单教程

    制作 Windows 10 启动盘 U盘 / USB 安装盘图文教程  http://rufus.akeo.ie/downloads/rufus-2.2p.exe 1.将U盘连接到电脑,以管理员身份运 ...

  2. 包含.h就可以用其对应的函数

    //callee.h 被调用者 #pragma once void display(); //展示函数 //callee.cpp 被调用者 #include "callee.h" ...

  3. Spark SQL metaData配置到Mysql

    构造以spark为核心的数据仓库: 0.说明     在大数据领域,hive作为老牌的数据仓库比较流行,spark可以考虑兼容hive.但是如果不想用hive做数据仓库也无妨,大不了我们用spark建 ...

  4. ev3_basic——HITCON CTF 2018

    [MISC] EN-US This challenge provides a jpg file and a pklg file. The jpg is shown a part of string o ...

  5. IP设置-内置服务器-外置服务器

    HBulider 中 运行 -> 设置web服务器 -> 内置服务器将 127.0.0.1 换为局域网的ip,可以在局域网内所有电脑,手机上浏览页面.但是只能浏览html,php asp等 ...

  6. Django实现cookie&session以及认证系统

    COOKIE&SESSION 知识储备 由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie的工作原理是:由服务器产生内 ...

  7. Django-made基础

    知识预览 ORM 创建表(建立模型) 添加表记录 查询表记录 修改表记录 删除表记录 回到顶部 ORM 映射关系: 表名 <-------> 类名 字段 <-------> 属 ...

  8. 软件包管理:rpm包管理-yum在线管理-IP地址配置和网络yum源

    只需告诉系统你想安装那个包,剩下的所有依赖问题yum都会解决. 有些情况下不能上网,但可以使用光盘. centos的yum是免费的.redhatyum付费. yum管理的其实同样是rpm包.并没有yu ...

  9. MySQL从删库到跑路_高级(六)——索引

    作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.索引简介 1.索引简介 索引(Index)是帮助MySQL高效获取数据的数据结构. 在MySQL中,索引属于存储 ...

  10. 限制 input 输入框只能输入纯数字

    oninput = "value=value.replace(/[^\d]/g,'')"