就是统计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. 寻找最小的k个数(四种方法)

    1 使用从大到小的优先队列保存最小的K个数,每次取出K个数之后的其余数和堆顶元素比较,如果比堆顶元素小,则将堆顶元素删除,将该元素插入 void topK(int arr[],int n,int k) ...

  2. first-child伪类选择器

    原文链接地址:https://www.cnblogs.com/wangmeijian/p/4562304.html :first-child 选择器用于选取属于其父元素的首个子元素的指定选择器.——w ...

  3. HTML基础代码

    <!--注释内容,在浏览时不会显示--><!DOCTYPE HTML> <!--声明文档类型--><html> <!--头部内容:--> & ...

  4. 位图索引对于DML操作的影响

    位图索引相对于常规的B-tree 索引,有着体积更加小的优势,节省空间.对于重复率特别高的字段,比如性别,比如省份.查询效率要优于B-tree 索引.那为什么我们总被告知在业务库中不要使用呢? 业务库 ...

  5. [iOS]一些第三方库

    BHInfiniteScrollView 地址 https://github.com/qylibohao/BHInfiniteScrollView 功能 图片轮播 TZImagePickerContr ...

  6. jQuery实现购物车计算价格功能的方法

    本文实例讲述了jQuery实现购物车计算价格功能的简易方法,做的比较简单,现分享给大家供大家参考.具体如下: 目的: <%@ page language="java" con ...

  7. NIO流—理解Buffer、Channel概念和NIO的读写操作

    NIO流与IO流的区别 面向流与面向块 IO流是每次处理一个或多个字节,效率很慢(字符流处理的也是字节,只是对字节进行编码和解码处理). NIO流是以数据块为单位来处理,缓冲区就是用于读写的数据块.缓 ...

  8. Vue中,给当前元素添加类名移除兄弟元素类名的方法

    在Vue中,给当前元素添加类名移除兄弟元素类名的方法 今天在项目中需要做一个效果,点击对应的li改变当前的color,其他的li取消颜色,在jQuery中这很容易,由于之前已经引入了jQuery,所以 ...

  9. daterangepicker的个性化使用技巧

    由于该模板不自动将时间戳添加到input中去,始终为NaN,所以,自己选取起始时间与截止时间 var startTime =new Date(new Date().toLocaleDateString ...

  10. 飞控入门之C语言结构体、枚举

    结构体 先来说明一下,结构体存在的意义.比如说有一只猫,要在C语言程序中综合描述它,那么可以这样说,它的体重是float类型的,颜色是char类型的,它的一些食物名字是一个数组,那么如果分开定义这些变 ...