ZOJ Seven Segment Display

来源:互联网 发布:2016淘宝刷单技巧 编辑:程序博客网 时间:2024/05/21 09:37

Seven Segment Display


TimeLimit:2 Seconds     Memory Limit:65536 KB


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

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

Inorder to display a hexadecimal number, the seven segment display componentneeds to consume some electrical energy. The total energy cost for display ahexadecimal number on the component is the sum of the energy cost fordisplaying each digit of the number. Edward found the following table on theInternet, 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 thecomponent for one second, 5 + 6 + 7 + 5 + 5 + 4 + 6 + 3 = 41 units of energywill be consumed.

Edward's hexadecimal counter works as follows:

  • The counter will only work forn seconds. Aftern 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 numberm.
  • 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 andm, Edward is interestedin 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 integerT (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 numberm (00000000 ≤m ≤ FFFFFFFF), their meanings are describedabove.

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

Output

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

Sample Input

3
5 89ABCDEF
3 FFFFFFFF
7 00000000

Sample Output

208
124
327

Hint

Forthe first test case, the counter will display 5 hexadecimal numbers (89ABCDEF,89ABCDF0, 89ABCDF1, 89ABCDF2, 89ABCDF3) in 5 seconds. The total units of energycost 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.

Forthe 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.


题意:一个七段显示器,可以显示0~9以及A~F,显示每个字符需要消耗一定能量,然后用这些字符组成所有的八位十六进制数,所以每个数都会有一个消耗能量总和。题目给出一个初始的八位十六进制数m(转化为十进制数为x),以及一个数n,求显示【x,x+n-1】区间内每个十进制数的十六进制数形式所消耗的能量总和

思路:利用前缀和的思想即可,并用数位DP的记忆化搜索求解(注意+n后溢出的特殊情况)

(PS:ZOJ上输出long long型只能用%lld ,否则会出错)


#include <bits/stdc++.h>using namespace std;#define mst(a,b) memset((a),(b),sizeof(a))#define f(i,a,b) for(int i=(a);i<=(b);++i)#define ll long longconst int maxn = 1e6+5;const ll mod = 1e9+7;const ll INF = (ll)0xffffffff+1;const double eps = 1e-6;#define rush() int T;scanf("%d",&T);while(T--)int val[16]={6,2,5,5,4,5,6,3,7,6,6,5,4,5,5,4};int a[20];ll dp[10][1005];char s[20];ll change (char *s)                 //将十六进制转化为十进制{    ll ans=0;    for(int i=0;i<8;i++)    {        if(s[i]>='0'&&s[i]<='9')            ans=ans*16+s[i]-'0';        else            ans=ans*16+s[i]-'A'+10;    }    return ans;}ll dfs(int pos,ll sum,bool limit)     //记忆化搜索,limit为1时当前位有限制{    if(pos<0)        return sum;    if(!limit&&dp[pos][sum]!=-1)        return dp[pos][sum];    int x=limit?a[pos]:15;    ll ans=0;    for(int i=0;i<=x;i++)    {        ans+=dfs(pos-1,sum+val[i],limit&&(i==a[pos]));    }    if(!limit)        dp[pos][sum]=ans;    return ans;}ll solve(ll x){    int pos=0;    mst(a,0);    while(x)    {        a[pos++]=x%16;        x/=16;    }    return dfs(7,0,true);   //从最高位开始dfs}int main(){    ll n;    mst(dp,-1);    rush()    {        scanf("%lld%s",&n,s);        ll l=change(s);        if(l+n-1>=INF)                           //累加后超过最大值        {            ll r=(l+n-1)%INF;             printf("%lld\n",(solve(INF-1)-solve(l-1))+solve(r));        }        else        {            ll r=l+n-1;            printf("%lld\n",solve(r)-solve(l-1));        }    }    return 0;}

0 0
原创粉丝点击