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. [vue]v-bind: sytle/class-bind&属性值绑定

    v-bind - style绑定 - class绑定 - 属性值绑定 <!DOCTYPE html> <html lang="en"> <head&g ...

  2. (转)Springboot 中filter 注入对象

    问题:我建立一个全局拦截器,当然,这是测试的时候建立的,我把它命名为LogFilter,它继承了Filter,web应用启动的顺序是:listener->filter->servlet,而 ...

  3. Centos expect spawn、linux expect 用法

    使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理.  脚本代码如下:  ###### ...

  4. numpy 中clip函数的使用

    其中a是一个数组,后面两个参数分别表示最小和最大值 也就是说clip这个函数将将数组中的元素限制在a_min, a_max之间,大于a_max的就使得它等于 a_max,小于a_min,的就使得它等于 ...

  5. SpringMyBatisDay03

    1.Spring MVC 1)什么是Spring MVC Spring MVC是Spring框架中一个模块,实现MVC结构,便于简单,快速开发MVC结构的WEB应用,Spring MVC提供的API封 ...

  6. C#+Aspose.Cells 导出Excel及设置样式 (Webform/Winform)

    在项目中用到,特此记录下来,Aspose.Cells 不依赖机器装没有装EXCEL都可以导出,很方便.具体可以参考其他 http://www.aspose.com/docs/display/cells ...

  7. 翻译[RFC6238] TOTP: Time-Based One-Time Password Algorithm

    在闲暇时间做了一个TOTP相关的开源项目,在项目初步完成之余,我尝试对[RFC6238]文档进行了翻译,供大家参考与查阅,若有不妥之处,还望各位前辈海涵斧正. [RFC6238] : Time-Bas ...

  8. git提交时候出错

    Please make sure you have the correct access rights and the repository exists. 解决方案: 主要原因是没有加载keygen ...

  9. 小试---EF5.0入门实例1

    现在做个小练习吧~~~ 第一步:首先新建一个数据库名字为Test;数据库里面只有一个表UserTable 脚本为: USE [master] GO /****** 对象: Database [Test ...

  10. 【百度统计】设置页面元素点击事件转化pv、uv

    html元素点击事件内添加代码:_hmt.push(['_trackEvent', category, action, opt_label, opt_value]); 1. '_trackEvent' ...