16进制下的数位dp,由于固定了位数,可以出现前导零,反而简化了问题,和十进制异曲同工,只需要注意边界,对于[l,r],如果r>max,则分成[l,max-1]+max+[0,r-max-1],这是因为对于cal(N,x)函数来说计算的是[0,N)之间x的出现次数,并不包括N,如果只是简单的把max+1传进去的话就不是八位数了,这
样乱改函数的话更麻烦还不如直接把max抽出来计算方便。
    

 #include<bits/stdc++.h>
using namespace std;
#define LL long long
LL c[]={,,,,,,,,
,,,,,,,};
LL f[]={,};
LL p16[]={};
LL bit[];
void init(){
for(LL i=;i<=;++i) p16[i]=p16[i-]*;
for(LL i=;i<=;++i) f[i]=f[i-]*+p16[i-];
}
LL cal(LL N,LL x){
LL len=,ans=,tot=;
while(N){
bit[len++]=N%;
N/=;
}
while(len<) bit[len++]=;
bit[len]=-;
for(LL i=len-;i>=;--i){
ans+=f[i]*bit[i];
if(bit[i]>x) ans+=p16[i];
ans+=tot*bit[i]*p16[i];
if(bit[i]==x) tot++;
}
return ans;
}
LL to10(char *s){
LL ans=,len=strlen(s);
for(int i=;i<len;++i){
LL tmp=isdigit(s[i])?s[i]-'':(s[i]-'A'+);
ans=ans*+tmp;
}
return ans;
}
int main(){init();
char s[];
LL l,r,t,n,i,j,k;
LL MAX=to10("FFFFFFFF");
scanf("%lld",&t);
while(t--){
scanf("%lld",&k);
scanf("%s",s);
LL l=to10(s);
LL r=l+k-;
LL ans=; if(r<=MAX){
for(i=;i<=;++i) ans+=c[i]*(cal(r+,i)-cal(l,i));
}
else{
for(i=;i<=;++i) if(MAX>=l)ans+=c[i]*(cal(MAX,i)-cal(l,i));
ans+=c[]*;
for(i=;i<=;++i) ans+=c[i]*cal(r-MAX,i);
}
printf("%lld\n",ans);
}
return ;
}
/*
10
5 89ABCDEF
3 FFFFFFFF
7 00000000
*/

ZOJ-3962-数位dp的更多相关文章

  1. ZOJ 3962 Seven Segment Display(数位DP)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3962 题目大意: 有t组数据. 给你一个n,和8位的十六进制数s ...

  2. ZOJ 3962 Seven Segment Display(数位DP)题解

    题意:给一个16进制8位数,给定每个数字的贡献,问你贡献和. 思路:数位DP,想了很久用什么表示状态,看题解说用和就行,其他的都算是比较正常的数位DP. 代码: #include<iostrea ...

  3. ZOJ 3962 E.Seven Segment Display / The 14th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple E.数位dp

    Seven Segment Display Time Limit: 1 Second      Memory Limit: 65536 KB A seven segment display, or s ...

  4. ZOJ - 3962 - Seven Segment Display-17省赛-数位DP

    传送门:Seven Segment Display 题意:求一个给定区间每个数字的消耗值的和: 思路:数位DP,有点区间和的思想,还有就是这个十六进制,可以用%llx读,还是比较难的: 还有就是到最大 ...

  5. ZOJ 3494 BCD Code(AC自动机+数位DP)

    BCD Code Time Limit: 5 Seconds      Memory Limit: 65536 KB Binary-coded decimal (BCD) is an encoding ...

  6. ZOJ 3494 (AC自动机+高精度数位DP)

    题目链接:  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3494 题目大意:给定一些被禁止的BCD码.问指定范围内不含有 ...

  7. ZOJ 2599 Graduated Lexicographical Ordering (数位DP)

    首先要吐两行槽:看到集训队论文上有这道题,由于数位DP一律写成记忆化搜索形式的强迫症,就没去看论文上的几个函数是什么……:结果被这道题虐的脑细胞死光……,最后是用随机数据对拍AC程序然后发现BUG改掉 ...

  8. ZOJ 2599 Graduated Lexicographical Ordering ★(数位DP)

    题意 定义两个数的比较方法,各位数字之和大的数大,如果数字和相等则按字典序比较两个数的大小.输入n,k,求:1.数字k的排名:2.排名为k的数. 思路 算是一类经典的统计问题的拓展吧~ 先来看第一问. ...

  9. ZOJ 3494 BCD Code (AC自己主动机 + 数位DP)

    题目链接:BCD Code 解析:n个病毒串.问给定区间上有多少个转换成BCD码后不包括病毒串的数. 很奇妙的题目. . 经典的 AC自己主动机 + 数位DP 的题目. 首先使用AC自己主动机,得到b ...

  10. BCD Code ZOJ - 3494 AC自动机+数位DP

    题意: 问A到B之间的所有整数,转换成BCD Code后, 有多少个不包含属于给定病毒串集合的子串,A,B <=10^200,病毒串总长度<= 2000. BCD码这个在数字电路课上讲了, ...

随机推荐

  1. OA之为用户设置角色和为用户设置权限

    1.为用户设置角色 { Layout = null; } @using OA.Model <!DOCTYPE html> <html> <head> <met ...

  2. binlog分析方法

    线上处理问题的时候经常遇到业务说写入了但是数据不对,这种情况八成是业务改了之后又改过来了.但是我们需要证据,下面我们就说说简单的binlog分析 工具:mysqlbinlog #-vvv显示明文sql ...

  3. Python开发【Django】:Form组件

    Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 创建Form类时,主要涉及到 [ ...

  4. 获取List、Set、Map等字段的泛型参数

    测试类加单元测试方法,运行结果在注释里面: package temp; import org.junit.Test; import java.lang.reflect.Field; import ja ...

  5. conda

    Conda是什么? Conda 是Anaconda下用于包管理和环境管理的命令行工具, Conda下一切都是包,包括Python和conda自己 Conda ≍ pip(包管理) + vitualen ...

  6. 【原创】PHPstorm本地修改同步保存到远程服务器

    PHPstorm设置本地修改的代码同步保存到远程服务器: 设置里面搜索“Deployment”,选择+号,然后选择SFTP: 填写远程主机的信息: 然后选择Mappings,填写本地代码路径和远程主机 ...

  7. PAT 1043 Is It a Binary Search Tree[二叉树][难]

    1043 Is It a Binary Search Tree(25 分) A Binary Search Tree (BST) is recursively defined as a binary ...

  8. java 的==和equals的区别(二)

    java 的==和equals的区别 java 的==和equals的区别 ==通常表明引用的是同一个东西(引用的地址相同),equals通常表明两个对象的内容相同(值相同) ------------ ...

  9. 更好的利用配置文件和importlib

    需求:做不同的操作时只需修改配置文件即可完成 # message/email.py from .base import Base # 子类必须实现send方法,否则抛出异常 class Email(B ...

  10. MDI QMdiArea 多文档区域

    Qt下创建类似window平台的MDI多文档区域使用QMdiArea QMdiArea * mdiArea; mdiArea = new QMdiArea(this); //A widget 为win ...