Palindrome Function HDU - 6156(数位dp)
要求m-n内在l-r进制下的是回文数的总个数。
dp[进制][从第j为开始][目前到达第k位] = 总的方案数
dfs枚举目前的到达的位置,这个数开始的位置,进制,前导零,限制条件,然后枚举的时候如果我现在是总的数的前一半,那么我就可以随意枚举,如果我已经到这个数的后一半了,那么我枚举的数字应该要满足和前面一半的这个位置对应的数,否则的话就是不满足条件的回文数,用这个数开始的位置为0来表示这个数不满足条件或者说我枚举的这个数全部都是零。然后算出这个区间内的回文数,要求sumf(i, j), 那么就是这里面的回文数乘k+不是回文数的值。
#include<map>
#include<set>
#include<ctime>
#include<cmath>
#include<stack>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x & (-x)) typedef unsigned long long int ull;
typedef long long int ll;
const double pi = 4.0*atan(1.0);
const int inf = 0x3f3f3f3f;
const int maxn = ;
const int maxm = ;
const int mod = ;
using namespace std; int T, tol;
ll n, m;
int digit[];
ll tmp[];
ll dp[][][]; ll dfs(int pos, int st, int k, bool lead, bool limit) {
if(pos == ) return st ? : ;
if(dp[k][st][pos] != - && !limit) return dp[k][st][pos];
ll ans = ;
int up = limit ? digit[pos] : k-;
for(int i=; i<=up; i++) {
tmp[pos] = i;
if(lead && i == ) ans += dfs(pos-, st-, k, lead, limit && i==digit[pos]);
else if(pos > st/) ans += dfs(pos-, st, k, , limit && i==digit[pos]);
else ans += dfs(pos-, i==tmp[st-pos+] ? st : , k, , limit && i== digit[pos]);
}
if(!limit) dp[k][st][pos] = ans;
return ans;
} ll solve(ll n, int k) {
memset(digit, , sizeof digit);
int pos = ;
while(n) {
digit[pos++] = n % k;
n /= k;
}
return dfs(pos-, pos-, k, , );
} int main() {
int cas = ;
scanf("%d", &T);
memset(dp, -, sizeof dp);
while(T--) {
int l, r;
scanf("%I64d%I64d%d%d", &m, &n, &l, &r);
m--;
ll ans = ;
for(int i=l; i<=r; i++) {
ll cnt1 = solve(n, i);
ll cnt2 = solve(m, i);
ans += (cnt1 - cnt2)*i + (n-m+cnt2-cnt1);
}
printf("Case #%d: %I64d\n", cas++, ans);
}
return ;
}
Palindrome Function HDU - 6156(数位dp)的更多相关文章
- 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6156 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6156 题意:如题. 解法:数位DP,暴力枚举进制之后,就转化成了求L,R区间的回文数的个数,这个直接做 ...
- HDU 6156 数位dp
Palindrome Function Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Ot ...
- hdu 4507 数位dp(求和,求平方和)
http://acm.hdu.edu.cn/showproblem.php?pid=4507 Problem Description 单身! 依旧单身! 吉哥依旧单身! DS级码农吉哥依旧单身! 所以 ...
- hdu 4352 数位dp + 状态压缩
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu:2089 ( 数位dp入门+模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 数位dp的模板题,统计一个区间内不含62的数字个数和不含4的数字个数,直接拿数位dp的板子敲就行 ...
- HDU 4352 XHXJ's LIS HDU(数位DP)
HDU 4352 XHXJ's LIS HDU 题目大意 给你L到R区间,和一个数字K,然后让你求L到R区间之内满足最长上升子序列长度为K的数字有多少个 solution 简洁明了的题意总是让人无从下 ...
- hdu 3709 数位dp
数位dp,有了进一步的了解,模板也可以优化一下了 题意:找出区间内平衡数的个数,所谓的平衡数,就是以这个数字的某一位为支点,另外两边的数字大小乘以力矩之和相等,即为平衡数例如4139,以3为支点4*2 ...
- HDU 2089 数位dp入门
开始学习数位dp...一道昨天看过代码思想的题今天打了近两个小时..最后还是看了别人的代码找bug...(丢丢) 传说院赛要取消 ? ... 这么菜不出去丢人也好吧~ #include<stdi ...
- HDU 2089 数位dp/字符串处理 两种方法
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
随机推荐
- MySQL 5.7默认ONLY_FULL_GROUP_BY语义介绍
mysql 5.7版本 出现 ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corre ...
- js 翻牌活动效果
直接上代码 html: <div class="index_main"> <ul class="index_card"> <li ...
- Windows BAT 命令下del 与 rd 命令
https://blog.csdn.net/jigetage/article/details/81180757 RD 与 DEL 命令 windows bat 目录和文件的删除处理. 命令:RD,删除 ...
- 单个源文件下CmakeList.txt
单个源文件下CmakeList.txt 1. main.c代码 & CmakeLists.txt 文件内容 在任意自己选定的目录下(t1/)编写main.c 与 CmakeLists.txt ...
- vue.js 添加 fastclick的支持
fastclick:处理移动端click事件300毫秒延迟 1.兼容性 iOS 3及更高版本的移动Safari iOS 5及更高版本的Chrome Android上的Chrome(ICS) Opera ...
- CodeForces 113B Petr#
题目链接:http://codeforces.com/problemset/problem/113/B 题目大意: 多组数据每组给定3个字符串T,Sbeg,Sed,求字符串T中有多少子串是以Sbeg开 ...
- 防火墙禁ping:虚拟机ping不通主机,但主机可以ping虚拟机
现象:刚装的centos6.6,配置好网络却发现ping不通主机,主机却ping通虚拟机: 解决方法: 1.最简单的方法就是:关闭防火墙.但一直关闭防火墙也不是个办法,会遇到很多安全问题,建议下一个方 ...
- python之路--subprocess,粘包现象与解决办法,缓冲区
一. subprocess 的简单用法 import subprocess sub_obj = subprocess.Popen( 'dir', #系统指令 shell=True, #固定方法 std ...
- 集合之HashMap(含JDK1.8源码分析)
一.前言 之前的List,讲了ArrayList.LinkedList,反映的是两种思想: (1)ArrayList以数组形式实现,顺序插入.查找快,插入.删除较慢 (2)LinkedList以链表形 ...
- python数据结构与算法第十三天【归并排序】
1.代码实现 def merge_sort(alist): if len(alist) <= 1: return alist # 二分分解 num = len(alist)/2 left = m ...