zoj 3962 Seven Segment Display(数位dp)

Seven Segment Display


Time Limit: 2 Seconds      Memory Limit: 65536 KB


A seven segment display, or seven segment indicator, is a form of electronic display device for displaying decimal numerals that is an alternative to the more complex dot matrix displays. Seven segment displays are widely used in digital clocks, electronic meters, basic calculators, and other electronic devices that display numerical information.

Edward, a student in Marjar University, is studying the course "Logic and Computer Design Fundamentals" this semester. He bought an eight-digit seven segment display component to make a hexadecimal counter for his course project.

In order to display a hexadecimal number, the seven segment display component needs to consume some electrical energy. The total energy cost for display a hexadecimal number on the component is the sum of the energy cost for displaying each digit of the number. Edward found the following table on the Internet, which describes the energy cost for display each kind of digit.

Digit Energy Cost
(units/s)
0 6
1 2
2 5
3 5
4 4
5 5
6 6
7 3
Digit Energy Cost
(units/s)
8 7
9 6
A 6
B 5
C 4
D 5
E 5
F 4

For example, in order to display the hexadecimal number "5A8BEF67" on the component for one second, 5 + 6 + 7 + 5 + 5 + 4 + 6 + 3 = 41 units of energy will be consumed.

Edward‘s hexadecimal counter works as follows:

  • The counter will only work for n seconds. After n seconds the counter will stop displaying.
  • At the beginning of the 1st second, the counter will begin to display a previously configured eight-digit hexadecimal number m.
  • At the end of the i-th second (1 ≤ i < n), the number displayed will be increased by 1. If the number displayed will be larger than the hexadecimal number "FFFFFFFF" after increasing, the counter will set the number to 0 and continue displaying.

Given n and m, Edward is interested in the total units of energy consumed by the seven segment display component. Can you help him by working out this problem?

Input

There are multiple test cases. The first line of input contains an integer T (1 ≤ T ≤ 105), indicating the number of test cases. For each test case:

The first and only line contains an integer n (1 ≤ n ≤ 109) and a capitalized eight-digit hexadecimal number m (00000000 ≤ m ≤ FFFFFFFF), their meanings are described above.

We kindly remind you that this problem contains large I/O file, so it‘s recommended to use a faster I/O method. For example, you can use scanf/printf instead of cin/cout in C++.

Output

For each test case output one line, indicating the total units of energy consumed by the eight-digit seven segment display component.

Sample Input

3
5 89ABCDEF
3 FFFFFFFF
7 00000000

Sample Output

208
124
327

Hint

For the first test case, the counter will display 5 hexadecimal numbers (89ABCDEF, 89ABCDF0, 89ABCDF1, 89ABCDF2, 89ABCDF3) in 5 seconds. The total units of energy cost is (7 + 6 + 6 + 5 + 4 + 5 + 5 + 4) + (7 + 6 + 6 + 5 + 4 + 5 + 4 + 6) + (7 + 6 + 6 + 5 + 4 + 5 + 4 + 2) + (7 + 6 + 6 + 5 + 4 + 5 + 4 + 5) + (7 + 6 + 6 + 5 + 4 + 5 + 4 + 5) = 208.

For the second test case, the counter will display 3 hexadecimal numbers (FFFFFFFF, 00000000, 00000001) in 3 seconds. The total units of energy cost is (4 + 4 + 4 + 4 + 4 + 4 + 4 + 4) + (6 + 6 + 6 + 6 + 6 + 6 + 6 + 6) + (6 + 6 + 6 + 6 + 6 + 6 + 6 + 2) = 124.



Author: ZHOU, Jiayu
Source: The 14th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple

数位dp,

 1 #include <bits/stdc++.h>
 2 #define LL long long
 3 using namespace std;
 4 int num[16]={6,2,5,5,4,5,6,3,
 5              7,6,6,5,4,5,5,4};
 6 int dig[20];
 7 int t;
 8 LL l,r,n;
 9 char a[20];
10 LL dp[20][1005];//dp[i][j]表示从高位枚举到第i位和为各位的和为sum
11
12 LL dfs(int pos,LL sum,bool limit){//枚举的位数
13     if(pos<0) return sum;
14     if(!limit&&dp[pos][sum]!=-1) return dp[pos][sum];
15     int res=limit?dig[pos]:15;
16     LL tmp=0;
17     for(int i=0;i<=res;i++){
18         tmp+=dfs(pos-1,sum+num[i],limit&&i==dig[pos]);
19     }
20     if(!limit) dp[pos][sum]=tmp;
21     return tmp;
22 }
23 LL judge(LL n){
24     for(int i=0;i<8;i++){
25         dig[i]=n%16;
26         n/=16;
27     }
28     return dfs(7,0,1);
29 }
30 int main(){
31     // freopen("in.txt","r",stdin);
32     memset(dp,-1,sizeof dp);
33     scanf("%d",&t);
34     while(t--){
35         scanf("%lld %llX",&r,&n);
36         r--;
37         l=n;
38         r+=l;
39         if(r>(LL)4294967295){
40             r%=(LL)(4294967296);
41             printf("%lld\n",judge((LL)4294967295)-judge(l-1)+judge(r));
42         }else{
43             printf("%lld\n",judge(r)-judge(l-1));
44         }
45     }
46     return 0;
47 }
时间: 2024-08-09 14:45:24

zoj 3962 Seven Segment Display(数位dp)的相关文章

ZOJ 3494 (AC自动机+高精度数位DP)

题目链接:  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3494 题目大意:给定一些被禁止的BCD码.问指定范围内不含有任何这些禁止的BCD码的数的个数. 解题思路: AC自动机部分: 首先insert这些被禁止的BCD码. 然后打一下自动机前后状态的转移的表,用BCD[i][j]表示自动机状态i时,下一个数字是j的自动机的下一个状态. 一开始我考虑最先dfs的位在自动机的位置,后来发现SB了.AC自动机有一个roo

ZOJ 3494 BCD Code (数位DP,AC自动机)

题意: 将一个整数表示成4个bit的bcd码就成了一个01串,如果该串中出现了部分病毒串,则是危险的.给出n个病毒串(n<=100,长度<21),问区间[L,R]中有几个数字是不含病毒串的(结果需要取模)?(0<L<=R<=10200) 思路: 区间非常大,怎样暴力统计都是不科学的.首先确定状态,按传统,一维必定是位数,二维就是压缩的状态了,如果长度为20个bit的话,200*104万的数组是不行的.类似多模式串匹配问题,病毒串可以构建成AC自动机,那么每个点可以代表一个独立

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

地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3962 题目: A seven segment display, or seven segment indicator, is a form of electronic display device for displaying decimal numerals that is an alternative to the more complex dot matrix

zoj 3494 BCD Code(AC自动机+数位dp)

题目链接:zoj 3494 BCD Code 题目大意:给定n个2进制串,然后有一个区间l,r,问说l,r之间有多少个数转换成BCD二进制后不包含上面的2进制串. 解题思路:AC自动机+数位dp.先对禁止串建立AC自动机,所有的单词节点即为禁止通行的节点.接着进行数位dp, 用solve(r) - solve(l-1), 这里的l需要用到大数减法.dp[i][j]表示第i为移动到节点j的可行方案数,每次枚举下一位数字,因 为是BCD二进制,所以每位数要一次性移动4个字符,中途有经过禁止点都是不行

CodeForces - 1073E :Segment Sum (数位DP)

You are given two integers l l and r r (l≤r l≤r ). Your task is to calculate the sum of numbers from l l to r r (including l l and r r ) such that each number contains at most k k different digits, and print this sum modulo 998244353 998244353 . For

[数位dp+二分] zoj Generalized Palindromic Number

题意: 找一个小于N的最大的且符合题意的数. 题意的数为,通过缩减后是回文的数,所谓的缩减就是相同连续的数看做一个数,如"155451111"其实就是"15451"是符合题意的数. 思路: 通过数位dp,然后二分求解. dp[i][j][k]代表第i位,已经放了j个数,最后长度是k的缩减回文数有几个. 然后需要一个ok[]数组代表放的数是什么,如果连续放相同的数就等于没放数. 遍历所有的长度就可以得到结果了. 其实不难发现,这种回文数一定是奇数位的. 代码: #in

ZOJ 3494 BCD Code (AC自己主动机 + 数位DP)

题目链接:BCD Code 解析:n个病毒串.问给定区间上有多少个转换成BCD码后不包括病毒串的数. 很奇妙的题目. . 经典的 AC自己主动机 + 数位DP 的题目. 首先使用AC自己主动机,得到bcd[i][j]表示状态i,加了数字j以后到达的状态.为-1表示不能转移 然后就是数位DP了 注意记录为0的状态 AC代码: #include <cstdio> #include <iostream> #include <cstring> #include <algo

Codeforces1073E Segment Sum 【数位DP】

题目分析: 裸的数位DP,注意细节. 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int mod = 998244353; 5 int k; 6 7 int dp[25][1024],sz[25][1024],cnt[25][1024]; 8 int pw10[25],hp[25],num; 9 10 int dfs(int now,int lst){ 11 if(now == 0) return 0; 12 int a

数位DP Ⅱ

本节题目:数位之间和的关系.一般需要多加一维状态f[i][j][k]:表示长度为i,第一位是i,数位和等于k的数列个数 Seven Segment Display 题意:每个数字都有一个对应的权值,求l~r(十六进制数)之间所有数的所有数字的权值和 预处理数组有点麻烦,f[i][j]表示长度为i,第一个数是j的所有数列的数位之和的总和,f[i][j]=f[i-1][0~15]+j*(长度为i-1的数列个数即pow(16,i-1)). dp枚举第i位的数字时统计时还要算上last*(长度为i-1的