就是统计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. WebSocket的原理,以及和Http的关系 (转载)

    一.WebSocket是HTML5中的协议,支持持久连接:而Http协议不支持持久连接. 首先HTMl5指的是一系列新的API,或者说新规范,新技术.WebSocket是HTML5中新协议.新API. ...

  2. windows设置控制台编码格式为UTF-8

    1.运行CMD 2.输入CHCP查看当前编码格式. 3.输入 CHCP 65001设置编码方式为UTF-8 注意,到此处并没有完全修改,只是修改了当前页面,怎么完全修改? 4.右击控制台,选择属性: ...

  3. mysql 5.7设置密码无效

    我现在MySQL的版本时8.0.12,以前一直没有给MySQL设置密码. 今天因为需要,给MySQL设置,密码,但是上网搜了好久.....命令都不对.最后搜到csdn的Bpazy大佬的博客.他使用5. ...

  4. 歌词解析&class

    class song_song: def __init__(self,lrc_file): # 定义两个字典一个列表备用 self.song_file = lrc_file self.song_lrc ...

  5. Python绘制奥运五环

    绘制奥运五环主要涉及到Python中的turtle绘图库运用: turtle.forward(distance) 向当前画笔方向移动distance像素长度 turtle.backward(dista ...

  6. querySelectorAll 和 getElementBy 方法的区别

    作者:简生 链接:https://www.zhihu.com/question/24702250/answer/28695133 来源:知乎 1. W3C 标准 querySelectorAll 属于 ...

  7. WebGl 平移(矩阵变换)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. python写员工信息表作业笔记

    需求 流程图

  9. sklearn的train_test_split,果然很好用啊!

    sklearn的train_test_split   train_test_split函数用于将矩阵随机划分为训练子集和测试子集,并返回划分好的训练集测试集样本和训练集测试集标签. 格式: X_tra ...

  10. Python彩蛋--zen of python

    今天早上在公交上浏览博客的时候,发现了python里面的一个小彩蛋--zen of python 一首python之歌 我们来看一看... ​ 是不是很简单,在python shell 里 输入 im ...