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. Win10+vs2012+cuda8.0的安装与配置

    安装环境说明:NVDIA GeForce 930M.Intel(R) HD Graphics 520 显卡和cuda需要兼容匹配,我一开始下载的cuda6.5无法安装,所以又重新下了比较新的cuda8 ...

  2. Improving the quality of the output

    There are a variety of reasons you might not get good quality output from Tesseract. It's important ...

  3. STL学习笔记--特殊容器

    容器配接器 (1) stack 栈 后进先出(LIFO), 头文件#include<stack> template<class _Ty, class _Container = deq ...

  4. Java接口多线程并发测试 (一)

    本文为作者原创,禁止转载,违者必究法律责任!!! 本文为作者原创,禁止转载,违者必究法律责任!!! Java接口多线程并发测试 一,首先写一个接口post 请求代码: import org.apach ...

  5. mysql主从数据库不同步的2种解决方法 (转载)

    今天发现Mysql的主从数据库没有同步 先上Master库: mysql>show processlist; 查看下进程是否Sleep太多.发现很正常. show master status; ...

  6. IO—代码—基础及其用例

    字节流:文件.图片.歌曲 使用字节流的应用场景:如果是读写的数据都不需要转换成字符的时候,则使用字节流. 字节流处理单元为1个字节, 操作字节和字节数组.不能直接处理Unicode字符 字节流可用于任 ...

  7. Filter—过滤器

    过滤器的作用是什么? 1.拦截传入的请求和传出的响应,能拿到请求和响应中的数据 2.监视,修改,或处理正在客户端和服务器之间交换的数据流 3.利用过滤器的执行时机,实现Web程序的预处理,和后期的处 ...

  8. 浏览器内核控制标签meta说明

    由于众所周知的原因,国内的主流浏览器都是双核浏览器:基于Webkit的内核用于常用网站的高速浏览,基于IE的内核主要用于部分网银.政府.办公系统等网站的正常使用.以360浏览器为例,我们优先通过Web ...

  9. UVA10066

    /* 最长公共子序列 */ #include <cstdio> #include <string.h> #include <iostream> const int ...

  10. MAVEN打包丢失xml文件解决办法

    MAVEN打包默认只包含src/main/java下的class文件,如果需要包含xml.properties等文件,请在build节点下面添加如下代码 <resources> <r ...