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. PHP 常用命令行

    1.PHP运行指定文件 php -f test.php (-f 可省略) 2.命令行直接运行PHP代码 php -r "phpinfo();" 如果结果太长,还可以 php -r ...

  2. [运维-安全]CentOS7.0环境下安装kangle和easypanel

    一.康乐简介 主要特点1.免费开源kangle技术团队希望国人拥有一款真正好用.易用.实用的国产web服务器.2.跨平台可在linux.windows.freebsd.openbsd.netbsd.s ...

  3. mysql集群搭建,主主复制

    1:mysql搭建远程连接 https://www.cnblogs.com/davidgu/p/3706663.html 2: 两台主机能够相互通信 ,使用ping C:\Users\lenovo&g ...

  4. PAT 1015 Reversible Primes[求d进制下的逆][简单]

    1015 Reversible Primes (20)(20 分)提问 A reversible prime in any number system is a prime whose "r ...

  5. HTML鼠标悬停改变样式

    a.tt:hover {color: #FF0000;} <a class="tt" href="test.html">test</a> ...

  6. wcf 服务器无法处理请求由于内部错误

    The server was unable to process the request due to an internal error.  For more information about t ...

  7. Android开发中,系统是如何区分不同的App的(转自csdn)

    转自:http://bbs.csdn.net/topics/391868975?page=1 1判断是否为同一个app,仅仅是包名,签名是保证你的app不被第三方恶意替换.当包名相同,但签名不同时,系 ...

  8. 集合框架—常见的Set集合

    list ArrayList 动态数组结构存储,遍历速度快,索引随机访问快,允许多空值 LinkedList 底层数据结构是链表,插入和删除速度快. Vector 数组结构存储,线程安全的,查找速度快 ...

  9. 结合ajax 的表单验证

    浪费了我两天的时间 我也是醉了 html  结构 <!-- 密码修改 --> <div class="modal fade" id="operatePa ...

  10. Linux下的Make命令实例详解

    众所周知在Linux系统下的make 命令是系统管理员和程序员用的最频繁的命令之一.管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问题.下面这 篇文章我们将用一 ...