Bomb
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 3362 Accepted Submission(s): 1185
Problem Description
The counter-terrorists found a time bomb in the dust. But this time the terrorists improve on the time bomb. The number sequence of the time bomb counts from 1 to N. If the current number sequence includes the sub-sequence "49", the power of the blast would add one point.
Now the counter-terrorist knows the number N. They want to know the final points of the power. Can you help them?
Now the counter-terrorist knows the number N. They want to know the final points of the power. Can you help them?
Input
The first line of input consists of an integer T (1 <= T <= 10000), indicating the number of test cases. For each test case, there will be an integer N (1 <= N <= 2^63-1) as the description.
The input terminates by end of file marker.
The input terminates by end of file marker.
Output
For each test case, output an integer indicating the final points of the power.
Sample Input
3 1 50 500
Sample Output
0 1 15
Hint
From 1 to 500, the numbers that include the sub-sequence "49" are "49","149","249","349","449","490","491","492","493","494","495","496","497","498","499", so the answer is 15.
Author
fatboy_cw@WHU
Topic link: http://acm.hdu.edu.cn/showproblem.php?pid=3555
meaning of the title
Find the number of numbers 49 in 1~N 1 <= N <= 2^63-1 to
analyze
the digital DP. This routine for finding the number of numbers that do not contain a certain number string is as follows.
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; long long dp[25][3]; /* * dp[i][0], indicating that it does not contain 49 * dp[i][1], means that it does not contain 49, and the highest bit is 9 * dp[i][2], means containing 49 */ void init() { dp[0][0]=1; dp[0][1]=dp[0][2]=0; for(int i=1;i<25;i++) { dp[i][ 0 ]= 10 *dp[i- 1 ][ 0 ]-dp[i- 1 ][ 1 ]; // Add 0~9 numbers in front, subtract 4 in front of 9 dp[ i][ 1 ]=dp[i- 1 ][ 0 ]; // Add 9 to the highest bit dp[i][ 2 ]= 10 *dp[i- 1 ][ 2 ]+dp[i- 1 ][ 1 ]; // Add any number in front of 49, or add 4 in front of 9 } } int bit[ 25 ]; long long calc( long long n) { int len=0; while(n) { bit[++len]=n%10; n/=10; } bit[len+1]=0; bool flag=false; long long ans=0; for(int i=len;i>=1;i--) { ans+=dp[i-1][2]*bit[i]; if(flag)ans+=dp[i-1][0]*bit[i]; else { if(bit[i]>4)ans+=dp[i-1][1]; } if(bit[i+1]==4&&bit[i]==9)flag=true; } if (flag)ans++; // Add n itself return ans; } intmain () { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int T; long long n; scanf("%d",&T); init(); while(T--) { scanf("%I64d",&n); printf("%I64d\n",calc(n)); } return 0; }