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. string、const char*、 char* 、char[]相互转换(待整理)

    string.const char*. char* .char[]相互转换(全) https://blog.csdn.net/rongrongyaofeiqi/article/details/5244 ...

  2. hover()与toggle()

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. zookeeper简单实战

    一.安装(单机模式.集群模式.伪集群模式) 1:安装JDK 2:解压zk压缩包 3:在conf目录下创建zoo.cfg配置文件. 设置超时时间,快照目录,事务日志文件目录,对外端口,服务IP 4:启动 ...

  4. UNIX历史

    一.Multics计划 1965年,AT&T贝尔电话实验室.通用电气公司.麻省理工学院MAC课题组一起联合开发一个称为Multics的新操作系统. Multics 系统的目标是要向大的用户团体 ...

  5. ajax提交form(文本数据以及文件上传)

    $.ajax({ url: 'xxxx.do', type: 'POST', cache: false, data: new FormData($('.layui-form')[0]), proces ...

  6. ac1067

    这题说的是 有n个点在 圆上等分这个圆,然后 然后计算其中任意三个点能组成的锐角三角形的个数 首先这些点能组成的三角形的个数为 n*(n-1)*(n-2)/6  接下来计算不是锐角三角形的个数 固定任 ...

  7. python yield yield from

    1.可迭代对象 具备可迭代的能力,即enumerable,在python中指的是可以通过for-in去逐个访问元素的一些对象,比如元组tuple,列表list,字符串string,文件对象file等. ...

  8. Python: 字典列表: itemgetter 函数: 根据某个或某几个字典字段来排序列表

    问题:根据某个或某几个字典字段来排序Python列表 answer: 通过使用operator 模块的itemgetter 函数,可以非常容易的排序这样的数据结构 eg: rows = [ {'fna ...

  9. linux常用命令:find 命令参数详解

    find一些常用参数的一些常用实例和一些具体用法和注意事项. 1.使用name选项: 文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用.  可以使用某种文件名模式来匹配 ...

  10. centos7 centos-home 磁盘转移至centos-root下

    1.查看分区 df -h (centos-home和centos-root每人的名字可能不一样) vgdisplay (查看空闲磁盘大小) 2.备份home分区文件 tar cvf /tmp/home ...