就是统计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. java SSM 框架 多数据源 代码生成器 websocket即时通讯 shiro redis 后台框架源码

    A 调用摄像头拍照,自定义裁剪编辑头像 [新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统]B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单;  技 ...

  2. [iOS]被忽略的main函数

    如同任何基于C的应用程序,程序启动的主入口点为iOS应用程序的main函数.在iOS应用程序,main函数的作用是很少的.它的主要工作是控制UIKit framework.因此,你在Xcode中创建任 ...

  3. quartz定时任务时间表达式说明

    quartz定时任务时间表达式说明   这些星号由左到右按顺序代表 :    *    *     *     *    *     *   *     格式: [秒] [分] [小时] [日] [月 ...

  4. NOIP模拟赛D2T1自己的解题思路

    T1题目在此: 数轴上有n个球,每个球直径为1,第 ii 个球的左端点为pi即占据了数轴上[pi,pi+1][pi,pi+1]).在 P位置有一堵墙.有q个操作,每次要么以x位置为左端点放一个新球(如 ...

  5. dfs板子题-Hdu1283Vegetables

    题目描述毕业后,Vegetable在一家建筑公司找到了工作.他所在的城市将要进行整修,要求把所有空地修成公园. 市区是一个N*M的矩形,Vegetable拿到了该市的地图,现在判断共要修几处公园? 注 ...

  6. Qt绘制动态曲线

    首先*.pro文件中加一句 QT += charts 然后 mainwindow.cpp文件如下: #include "mainwindow.h" #include "u ...

  7. webstorm 常用的快捷键

    1. ctrl + shift + n: 打开工程中的文件,目的是打开当前工程下任意目录的文件.2. ctrl + j: 输出模板3. ctrl + b: 跳到变量申明处4. ctrl + alt + ...

  8. Mysql浅析-基础命令(一)

    主要从以上篇幅来介绍mysql的一些知识点 一.Mysql简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数 ...

  9. Redis笔记 -- make编译安装报错记录2则(一)

    1.Redis的获取与安装,目前最新稳定版本为4.0.10 Redis:  https://redis.io/download GitHub:  https://github.com/antirez/ ...

  10. php 实现重定向的三种方式

    header()函数; header('location:http://www.baidu.com'); meta标签; echo '<meta http-equiv="refresh ...