Bomb
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 8666 Accepted Submission(s): 3030
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 15HintFrom 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
Source
Recommend
题目大意问一个数小于等于他出现过49的数的个数
dp[i][0]代表的是出现的个数
dp[i][1]代表没有出现但是最高位的9的个数
dp[i][2]代表的是没有出现的个数
ac代码
#include<stdio.h>
#include<string.h>
__int64 dp[25][3];
int bit[25];
void init()
{
int i;
memset(dp,0,sizeof(dp));
dp[0][2]=1;
for(i=1;i<25;i++)
{
dp[i][0]=dp[i-1][0]*(__int64)10+dp[i-1][1];//当已经出现49,这一位就是10个数随便填,或者上一位是9这一位填4就好
dp[i][1]=dp[i-1][2];//就在没出现的基础上前边填9就好
dp[i][2]=dp[i-1][2]*(__int64)10-dp[i-1][1];//以前没出现在最前边填任意10个数再减去上一位为9这一位是4的情况
}
}
__int64 slove(__int64 n)
{
int i,len=0,flag=0;
__int64 ans=0;
memset(bit,0,sizeof(bit));
n++;
while(n)
{
bit[++len]=n%10;
n/=10;
}
bit[len+1]=0;
for(i=len;i;i--)
{
ans+=dp[i-1][0]*(__int64)bit[i];
if(flag)
{
ans+=dp[i-1][2]*(__int64)bit[i];
}
if(!flag&&bit[i]>4)
{
ans+=dp[i-1][1];
}
if(bit[i]==9&&bit[i+1]==4)
{
flag=1;
}
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
init();
while(t--)
{
__int64 n;
int len=0;
scanf("%I64d",&n);
printf("%I64d\n",slove(n));
}
}