ZOJ 3962
就是统计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的更多相关文章
- 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 ...
- ZOJ 3962 Seven Segment Display(数位DP)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3962 题目大意: 有t组数据. 给你一个n,和8位的十六进制数s ...
- 2017浙江省赛 E - Seven Segment Display ZOJ - 3962
地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3962 题目: A seven segment display, or ...
- zoj 3962 Seven Segment Display 数位dp
非常好的一个题,可以比赛时想到的状态太奇葩,不方便转移,就一直没能AC. 思路:dp(i, j)表示已经考虑了前i位,前i位的和为j的贡献.如果当前的选择一直是最大的选择,那么就必须从0~下一位的最大 ...
- ZOJ 3962 Seven Segment Display(数位DP)题解
题意:给一个16进制8位数,给定每个数字的贡献,问你贡献和. 思路:数位DP,想了很久用什么表示状态,看题解说用和就行,其他的都算是比较正常的数位DP. 代码: #include<iostrea ...
- ZOJ 3962 Seven Segment Display
Seven Segment Display 思路: 经典数位dp 代码: #include<bits/stdc++.h> using namespace std; #define LL l ...
- 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 ...
- ZOJ 3962:Seven Segment Display(思维)
https://vjudge.net/problem/ZOJ-3962 题意:有16种灯,每种灯的花费是灯管数目,代表0~F(十六进制),现在从x开始跳n-1秒,每一秒需要的花费是表示当前的数的花费之 ...
- ZOJ - 3962 - Seven Segment Display-17省赛-数位DP
传送门:Seven Segment Display 题意:求一个给定区间每个数字的消耗值的和: 思路:数位DP,有点区间和的思想,还有就是这个十六进制,可以用%llx读,还是比较难的: 还有就是到最大 ...
随机推荐
- Laravel发送邮件配置-问题解决
MAIL_DRIVER=smtp MAIL_HOST=smtp..com MAIL_PORT= MAIL_USERNAME=phpfangzhan@@@@@.com MAIL_PASSWORD=*** ...
- ORA-27300: OS system dependent operation:sendmsg failed with status: 105 ORA-27301: OS failure message: No buffer space available
早上查看数据库alert日志,发现如下ORA-报错: kgxpvfynet: mtype: 61 process 6460 failed because of a resource problem i ...
- oracle创建用户、表空间、临时表空间、分配权限步骤详解
首先登陆管理员账号,或者有DBA权限的用户,接下来依次: --查询所有用户select * from dba_users;--创建新用户create user gpmgt identified by ...
- mina 通讯框架
Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP.UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务.虚拟机管道通信服务等),M ...
- nodejs中npm以及yarn常用指令
1.npm下载相关 1.npm install/i vue //下载vue的包 2.npm i vue --save-dev / -D //下载vue的包,并添加到开发依赖中 3.npm i //下载 ...
- 遍历语法for...in for...of iterator
1.Javascript最常见的遍历语法是for循环 缺点:写法较为麻烦 for (let index = 0; index < array.length; index++) { const e ...
- laravel5.5源码笔记(一、入口应用的初始化)
laravel的项目入口文件index.php如下 define('LARAVEL_START', microtime(true)); require __DIR__.'/../vendor/auto ...
- PHP导入Excel表
初始化参数,先导入PHPExcel类 /** * 读出Excel表格数据 * @param $filename 文件名 * @param string $encode 编码格式 * @return a ...
- Delphi XE5的Android开发平台搭建
Delphi XE5支持Android ARM的开发,可以在Android虚拟机里运行,因此建议将XE5安装在64bit的Windows,内存可以大于3GB Delphi XE5安装光盘中包含了最基本 ...
- IOT大数据大世界大未来,物联网产业大数据应用简析
在物联网时代,面对PB级的数据,企业将难以以一己之力完成基础设施的建设.物联网所产生的大量数据不仅会驱动现在的数据中心发生根本性的变化,同时也会驱动相关企业采用新的大数据策略. 物联网的价值在于数据: ...