就是统计1~n中出现的各个数字的次数,当然是在16进制下。

不过有个区间问题的小技巧,统计从 [x,y] 可以转换成 从 [1,y] 减去 [1,x-1]。

不过要分类讨论一下,因为有可能会出现溢出,从ffffffff +1 得到 00000000 就是溢出了。

因为 n < 1e9 所以只会溢出一次。

// 290ms

#include<cstdio>
#include<cmath>
#include<cctype> const int cost[] = {,,,,,,,,
,,,,,,,}; long long solve(long long n, int k) {
long long i = ; // 位数
long long cnt = ;
long long low = ;
long long tmp = n;
while(n) {
long long t = n % ;
n /= ;
low = tmp % i;
if(t < k) {
cnt += n*i;
} else if(t > k) {
cnt += (+n)*i;
} else {
cnt += n*i;
cnt += low+;
}
i *= ;
}
return cnt;
}
int Hex(char c){
if(isdigit(c))
return c-'';
return c - 'A' + ;
}
int main() {
int t;
scanf("%d",&t);
for(int i=;i<t;i++){
long long n;
long long x=;
char str[];
scanf("%lld%s",&n,str);
for(int i=;i<;i++)
x = (x<<) + Hex(str[i]);
long long cnt = ;
long long ans = ; if((n-)+x <= 4294967295ll){ // 没有溢出
long long tmp;
for(int i=;i<;i++){
tmp = solve((n-1ll)+x,i);
cnt += tmp;
ans += tmp*cost[i];
}
for(int i=;i<;i++){
tmp = solve(x-,i);
cnt -= tmp;
ans -= tmp*cost[i];
}
ans += (n*-cnt)*cost[];
}else {
long long tmp;
for(int i=;i<;i++){
tmp = solve(4294967295ll,i);
cnt += tmp;
ans += tmp*cost[i];
}
for(int i=;i<;i++){
tmp = solve(x-,i);
cnt -= tmp;
ans -= tmp*cost[i];
}
for(int i=;i<;i++){
tmp = solve((n-2ll)+x-4294967295ll,i);
cnt += tmp;
ans += tmp*cost[i];
}
ans += (n*-cnt)*cost[];
}
printf("%lld\n",ans);
}
return ;
}

搜了一下题解发现可以用数位dp做。。

当时倒是也想到了数位dp但是因为做过的都是不定长的,所以就没有想到可以定长为8。

// 250ms

#include<cstdio>
#include<cmath>
#include<cstring>
#include<cctype> int digit[];
long long dp[][];
const int cost[] = {,,,,,,,,
,,,,,,,}; long long dfs(int d,int sum,bool shangxian){
if(d == )return sum;
if(!shangxian && dp[d][sum] != -)
return dp[d][sum];
int maxn = shangxian?digit[d]:;
long long tmp = ;
for(int i=;i<=maxn;i++){
tmp += dfs(d-,sum+cost[i],shangxian && i==maxn);
}
return shangxian?tmp:dp[d][sum]=tmp;
}
long long solve(long long x){
int k = ;
if(x<)return ;
memset(digit,,sizeof(digit));
while(x){
digit[++k] = x % ;
x /= ;
}
return dfs(,,);
}
int Hex(char c){
if(isdigit(c))
return c-'';
return c - 'A' + ;
}
int main() {
int t;
memset(dp,-,sizeof(dp));
scanf("%d",&t);
while(t--){
long long n;
long long x=;
char str[];
scanf("%lld%s",&n,str);
for(int i=;i<;i++)
x = (x<<) + Hex(str[i]);
// 4294967295ll
if(x+n- <= 4294967295ll)
printf("%lld\n",solve(x+n-)-solve(x-));
else
printf("%lld\n",
solve(4294967295ll)-solve(x-)+solve(x+n--4294967295ll));
}
return ;
}

ZOJ 3962的更多相关文章

  1. ZOJ 3962 Seven Segment Display 16进制的八位数加n。求加的过程中所有的花费。显示[0,F]有相应花费。

    Seven Segment Display Time Limit: Seconds Memory Limit: KB A seven segment display, or seven segment ...

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

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

  3. 2017浙江省赛 E - Seven Segment Display ZOJ - 3962

    地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3962 题目: A seven segment display, or ...

  4. zoj 3962 Seven Segment Display 数位dp

    非常好的一个题,可以比赛时想到的状态太奇葩,不方便转移,就一直没能AC. 思路:dp(i, j)表示已经考虑了前i位,前i位的和为j的贡献.如果当前的选择一直是最大的选择,那么就必须从0~下一位的最大 ...

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

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

  6. ZOJ 3962 Seven Segment Display

    Seven Segment Display 思路: 经典数位dp 代码: #include<bits/stdc++.h> using namespace std; #define LL l ...

  7. 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 ...

  8. ZOJ 3962:Seven Segment Display(思维)

    https://vjudge.net/problem/ZOJ-3962 题意:有16种灯,每种灯的花费是灯管数目,代表0~F(十六进制),现在从x开始跳n-1秒,每一秒需要的花费是表示当前的数的花费之 ...

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

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

随机推荐

  1. 一些有用的社区论坛,wiki网站(持续更新)

    1. IBM开发者(IBM developerwork): 这是一个比较全面的网站,上面有关于linux 管理.linux内核设计.存储等各个方面的知识,内容广泛,参考价值很高 http://www. ...

  2. 【.net开发者自学java系列】使用Eclipse开发SpringMVC(2)

    大概熟悉了 Eclipse. 然后先上Spring MVC 官网看看. 可是英文太差?翻译咯.现在翻译可屌了,真高兴生活在现在科技发达的时代.活着在中国太美好了. 没出过国门就能看懂英文.我都崇拜自己 ...

  3. 网站jcms流程分析

    本实例大致流程:基于jsp页面,通过servlet传递数据调用方法,利用service更改数据库.本文重点分析的是其中的两个小方法add()和delete(),来反映出反射机制的一个具体作用:减少Se ...

  4. c#采用emit将DataTable转List

    前面已经说了List转DataTable,也整理了代码. 现在转回来说说DataTable转List. 先举一个例子 public class Person { public int Age{get; ...

  5. Java职业规划

    java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈 ...

  6. Windows环境下写Linux sh脚本的一次挖坑和填坑

    最近在研究Docker集群和安装的时候,需要准备若干台机器.所以我为节约时间,打算批量复制VM机器,然后用sh脚本命令执行机器名称和IP等基础配置信息的修改. 具体操作:我在windows环境下,用N ...

  7. PhpStorm 查看当前类中所有的方法

    展示当前类中的所有方法        Ctrl + F12 方法之间移动                          alt  +   向上箭头/向下箭头

  8. docker入门——安装(CentOS)、镜像、容器

    Docker简介 什么是docker 官方解释: Docker is the company driving the container movement and the only container ...

  9. python教程(五)·列表与元组

    在介绍了通用的序列操作后,我们来学习序列类型中的列表和元组 列表 回顾 我们已经初步学习了列表,在深入之前,让我们简单回顾一下以往的知识. 创建列表的方法: >>> list_1 = ...

  10. U盘,移动硬盘显示显示需要格式化怎么修复

    冷静别怕,用windows系统自带磁盘修复CHKDSK命令即可解决此问题. 首先,在开始菜单栏站到“运行”窗口,也就是c:\(命令提示符),win7可直接在开始菜单的搜索窗口中输入“cmd”. 其次, ...