hdu6156
hdu6156
题意
求 \([2, 36]\) 进制下,给定区间内的数是回文数的个数。每存在一个回文数,答案加上该回文数的进制。
分析
10进制下回文数是 数位DP 很常见的问题,这道题只需要把在转化数字的时候转化成对应的进制即可。
多开一维数组表示某个进制下的方案数,\(dp\) 数组只需要一次初始化。
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[40][60][60]; // 进制,起始位置,长度 (起始位置就是不为 0 的第一个数字)
int digit[60];
int num[60];
ll dfs(int jz, int st, int len, int limit) {
if(!len) return 1;
if(!limit && dp[jz][st][len] != -1)
return dp[jz][st][len];
ll res = 0;
int mx = limit ? digit[len] : (jz - 1);
for(int i = 0; i <= mx; i++) {
if(st == len && i == 0)
res += dfs(jz, st - 1, len - 1, limit && i == mx);
else {
num[len] = i;
if((st & 1) == 1) {
int mid = ((st + 1) >> 1);
if(len >= mid) {
res += dfs(jz, st, len - 1, limit && i == mx);
} else if(len < mid) {
if(num[mid * 2 - len] == i) {
res += dfs(jz, st, len - 1, limit && i == mx);
}
}
} else {
int mid = (st >> 1) + 1;
if(len >= mid) {
res += dfs(jz, st, len - 1, limit && i == mx);
} else {
if(num[st + 1 - len] == i) {
res += dfs(jz, st, len - 1, limit && i == mx);
}
}
}
}
}
if(!limit) dp[jz][st][len] = res;
return res;
}
ll f(int jz, int n) { // jz进制下小于等于 n 的回文数字的个数
int len = 0;
while(n) {
digit[++len] = n % jz;
n /= jz;
}
ll res = dfs(jz, len, len, 1);
return res;
}
int main() {
memset(dp, -1, sizeof dp);
int T;
scanf("%d", &T);
int Case = 0;
while(T--) {
int jz1, jz2;
int n, m;
scanf("%d%d%d%d", &n, &m, &jz1, &jz2);
ll ans = 0;
for(int i = jz1; i <= jz2; i++) {
ll num = f(i, m) - f(i, n - 1);
ans = ans + (1LL * num * i + (m - n + 1 - num));
}
printf("Case #%d: %lld\n", ++Case, ans);
}
return 0;
}
hdu6156的更多相关文章
- HDU-6156 Palindrome Function(数位DP)
一.题目 二.思路 1.这是很明显的数位DP: 2.和以往数位DP不同的是,这里带了个进制进来,而以往做是纯十进制下或者纯二进制下做操作.但是,不管多少进制,原理都是一样的: 3.这里有个小坑,题目中 ...
随机推荐
- P1275 魔板
题目描述 有这样一种魔板:它是一个长方形的面板,被划分成n行m列的n*m个方格.每个方格内有一个小灯泡,灯泡的状态有两种(亮或暗).我们可以通过若干操作使魔板从一个状态改变为另一个状态.操作的方式有两 ...
- Codeforces Round #268 (Div. 1) 468D Tree(杜教题+树的重心+线段树+set)
题目大意 给出一棵树,边上有权值,要求给出一个1到n的排列p,使得sigma d(i, pi)最大,且p的字典序尽量小. d(u, v)为树上两点u和v的距离 题解:一开始没看出来p需要每个数都不同, ...
- bootstrap-table 回显选中行,行样式
{ filed:'status', checkbox:true, formatter:function(value,row,index){ if (row.status == 1) //根据行里字段判 ...
- GYM - 100814 C.Connecting Graph
题意: 初始有n个点,m次操作.每次操作加一条边或者询问两个点第一次连通的时刻(若不连通输出-1). 题解: 用并查集维护每个点所在连通块的根.对于每次加边,暴力的更新新的根. 每次将2个块合并时,将 ...
- [LG1886]滑动窗口 单调队列
---题面--- 题解: 观察数据范围,这应该是一个复杂度O(n)的题.以最大值为例,考虑单调队列,维护一个单调递减的队列.从前向后扫,每次答案取队首,如果后面进入的比前面大,那么就弹出前面的数,因为 ...
- BZOJ1875: [SDOI2009]HH去散步 图上边矩乘
这道题十分的坑…… 我作为一只连矩乘都不太会的渣渣看到这道题就只能神搜了….. 首先说一下普通的矩乘求方案,就是高出邻接矩阵然后一顿快速幂….. 矩乘一般就是一些秘制递推….. 再说一下这道题,我们可 ...
- cookie中的path与domain属性详解
1.domain表示的是cookie所在的域,默认为请求的地址,如网址为www.jb51.net/test/test.aspx,那么domain默认为www.jb51.net.而跨域访问,如域A为t1 ...
- 特殊密码锁 的通过码是:(请注意,在openjudge上提交了程序并且通过以后,就可以下载到通过码。请注意看公告里关于编程作业的说明)
// // main.cpp // openjudge特殊密码锁 // // Created by suway on 17/11/20. // Copyright © 2017年 suway. // ...
- docker compose,link,Odoo
1.报错: /usr/bin/docker-current: Error response from daemon: driver failed programming external connec ...
- Spring 4 + Hibernate 4 下 getCurrentSession()的使用情况
前言:1 getCurrentSession创建的session会和绑定到当前线程,而openSession不会. 2 getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭 ...