|
BombTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 21085 Accepted Submission(s): 7890
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?
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.
Output
For each test case, output an integer indicating the final points of the power.
Sample Input
Sample Output
Author
fatboy_cw@WHU
Source
|
第一次碰到这种题,第一反应是暴力,,,,后来在百度找到了一篇比较清楚的文章
http://www.bubuko.com/infodetail-302143.html
假设输入的t=235,那么分四次统计:
1~199 确定2这一位
200~229 确定3这一位
230~234 确定4这一位
235 还剩一个本身的数235,最后判断自身是不是
#include<iostream>
#include<cstdio>
//#define ll long long
typedef long long ll;
using namespace std;
ll dp[25][3]; //这里一开始忘记改成ll,一直wa,心累
/*
*有三种状态:
*第一是 dp[i][0],在长度为i的数字里不存在为49的数字;
*第二是 dp[i][1],在长度为i的数字不含49但是最高位是9(只要高位在加4就是49XXXXX)
*第三是 dp[i][2],在长度为i的数字里存在数字是49的
*/
int bit[21];
ll t;
void init()
{
dp[0][0] = 1;
dp[0][1] = 0;
dp[0][2] = 0;
for(int i = 1;i <= 21;++i)
{
dp[i][0] = dp[i-1][0]*10 - dp[i-1][1]; //除去49XXX的情况
dp[i][1] = dp[i-1][0]; //前一段长度的不含49的数字个数前面直接加上9
dp[i][2] = dp[i-1][1] + dp[i-1][2]*10; // 前一段长度最高位为9的直接加上4以及前一段有49的
}
}
ll cal(ll n)
{
int temp = 0;
while(n)
{
bit[++temp] = n%10;
n /= 10;
}
ll ans = 0;
bit[temp+1] = 0;
bool has = false;
for(int i = temp;i >= 1;--i)
{
//bit[i]指的是有几个数字,假如bit[i]=5,那么该位上随便0,1,2,3,4都可以
ans += dp[i-1][2]*bit[i];
if(has)
{
//这里我还没搞懂┭┮﹏┭┮
ans += dp[i-1][0]*bit[i];
}
else
{
if(bit[i]>4)
{
ans += dp[i-1][1]; //低位是9的,前面加上4
}
}
if(bit[i+1]==4 && bit[i]==9)
{
has = true;
}
}
if(has)
{
ans++;
}
return ans;
}
int main()
{
init();
int n;
scanf("%d",&n);
while(n--)
{
scanf("%lld",&t);
printf("%lld\n",cal(t));
}
return 0;
}